如何正确地在MVC6中注入HttpContext

我的API中的数据服务层需要httpcontext中请求的信息,我读了这个问题 ,他们说我应该使用ActionContext而不是HttpContext.Current(在MVC6中停止)。

第一种方法是通过重写此方法来设置控制器内的数据:

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

或者通过注入服务层使用DI

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

但我不确定下面列出的这两行代码是否正确

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

当我这样做时,我得到了这个错误。

尝试激活时无法解析“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(); 

 public class QueryValueService { private readonly IHttpContextAccessor _accessor; public QueryValueService(IHttpContextAccessor httpContextAccessor) { _accessor = httpContextAccessor; } public string GetValue() { return _accessor.HttpContext.Request.Query["value"]; } } 

请注意,在上面的示例中, QueryValueService只应注册为TransientScoped而不是Singleton因为HttpContext是基于请求的…