Подтвердить что ты не робот

Как правильно вставить HttpContext в MVC6

Мой уровень обслуживания данных в моем API требовал информацию, относящуюся к запросу в httpcontext, я прочитал этот question, и они сказали, что я должен использовать ActionContext вместо HttpContext.Current(прекратите работу в MVC6).

Первый способ - установить данные внутри контроллера, переопределив этот метод:

public void OnActionExecuting(ActionExecutingContext context)
{
    var routeData = context.RouteData;
    var httpContext = context.HttpContext;
    ...
}

Или используя DI путем ввода в сервисный уровень

public MyService(IContextAccessor<ActionContext> contextAccessor)
{
    _httpContext = contextAccessor.Value.HttpContext;
    _routeData = contextAccessor.Value.RouteData;
}

но я не уверен, что обе строки кода, перечисленные ниже, являются правильным способом сделать DI

services.AddTransient<IContextAccessor<ActionContext>,ContextAccessor>();
services.AddTransient<IContextAccessor<ActionContext>>();

когда я это делаю, я получаю эту ошибку.

Невозможно разрешить службу для типа "Microsoft.AspNet.Mvc.ActionContext" при попытке активировать

Обновление веб-проект project.json

"DIMultiTenan.Infrastructure": "",
"DIMultiTenan.MongoImplementation": "", 
"Microsoft.AspNet.Server.IIS": "1.0.0-beta3",
"Microsoft.AspNet.Mvc": "6.0.0-beta3",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta3",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta3"
4b9b3361

Ответ 1

Если вы пытаетесь получить доступ к HttpContext, для этой цели вы можете использовать IHttpContextAccessor.

Пример:

services.AddTransient<QueryValueService>();

public class QueryValueService
{
    private readonly IHttpContextAccessor _accessor;

    public QueryValueService(IHttpContextAccessor httpContextAccessor)
    {
        _accessor = httpContextAccessor;
    }

    public string GetValue()
    {
        return _accessor.HttpContext.Request.Query["value"];
    }
}

Обратите внимание, что в приведенном выше примере QueryValueService должен быть зарегистрирован только как Transient или Scoped, а не Singleton, поскольку HttpContext основан на запросе...