如何在 MVC6 中正确注入 HttpContext
How properly inject HttpContext in 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"
如果您尝试访问 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 是基于每个请求的...
我的 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"
如果您尝试访问 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 是基于每个请求的...