c# – 如何在MVC6中注入HttpContext

我的数据服务层在我的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 web项目

"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"
如果您尝试访问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是基于请求的…

http://stackoverflow.com/questions/28970140/how-properly-inject-httpcontext-in-mvc6

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 如何在MVC6中注入HttpContext