Как Обратиться к HttpContext в ASP.NET Core
Как правило, переход от веб-форм или из MVC5 в ASP.NET Core требует значительного рефакторинга. Например,
HttpContext.Current был удалён в ASP.NET Core. Доступ к текущему контексту HTTP из отдельной библиотеки классов – это один из примеров беспорядочной архитектуры, которых ASP.NET Core пытается избежать. Есть несколько способов получить текущий контекст запроса в ASP.NET Core.Что такое HttpContext?
Это объект, содержащий информацию о текущем Http-запросе: авторизация, аутентификация, объекты запроса и ответа, сессию, текущего пользователя, отправленные данные формы и т.п. Каждый Http-запрос создаёт новый объект
HttpContext с актуальной информацией.1. Доступ к HttpContext из контроллера?
Контроллеры предоставляют свойство
ControllerBase.HttpContext, чтобы мы могли напрямую обращаться к контексту текущего Http-запроса:[HttpGet("/getDetails")]
public string GetDetails() {
var result =
"Method: " + HttpContext.Request.Method +
" Path: " + HttpContext.Request.Path;
return result;
}
Вывод:Method: GET Path: /getdetails2. Доступ к HttpContext из промежуточного ПО
Если вы пишете собственный вариант промежуточного ПО, то контекст текущего запроса передаётся в метод Invoke/InvokeAsync:
public async Task InvokeAsync (HttpContext context) {
…
}
3. Доступ к HttpContext из сервисаЕсли нужно получить доступ к
HttpContext в сервисе, мы можем сделать это с помощью интерфейса IHttpContextAccessor и его реализации по умолчанию HttpContextAccessor. Эту зависимость необходимо добавлять только в том случае, если мы хотим получить доступ к HttpContext в сервисе.Шаг 1. Зарегистрируйте зависимость и сервис:
public void ConfigureServicesШаг 2: внедрите
(IServiceCollection services) {
…
services.AddHttpContextAccessor();
// до .NET Core 2.2 используйте
//services
// .TryAddSingleton<IHttpContextAccessor,
// HttpContextAccessor>();
services.AddTransient<IUserService, UserService>();
…
}
IHttpContextAccessor в конструктор сервиса:public class UserService : IUserService {
private IHttpContextAccessor
_httpContextAccessor;
public UserService(IHttpContextAccessor hca)
{
_httpContextAccessor = hca;
}
public string GetLoginUserName() {
return _httpContextAccessor
.HttpContext.User.Identity.Name;
}
}
Источники:- https://www.telerik.com/blogs/how-to-get-httpcontext-asp-net-core
- https://stackoverflow.com/questions/38571032/how-to-get-httpcontext-current-in-asp-net-core