【发布时间】:2014-10-24 17:41:45
【问题描述】:
在 MVC 5 I 中,您可以使用 HttpContext.Current 访问 HttpContext。访问HttpContext 或更好的首选方式是什么,只有当前的RouteContext?
【问题讨论】:
标签: c# asp.net-mvc asp.net-core
在 MVC 5 I 中,您可以使用 HttpContext.Current 访问 HttpContext。访问HttpContext 或更好的首选方式是什么,只有当前的RouteContext?
【问题讨论】:
标签: c# asp.net-mvc asp.net-core
RouteContext 不是您通常想要访问的对象。 MVC 使用它来指示路由是否已处理,因此不会流动。您可能想改为访问 RouteData。
这里有几种访问它的方法:
在控制器上,您可以访问 - this.ActionContext.RouteData 或 HttpContext.Current 等效的 this.ActionContext.HttpContext 或直接 this.HttpContext
在ActionFilter 中,您可以通过方法参数访问它们:
public void OnActionExecuting(ActionExecutingContext context)
{
var routeData = context.RouteData;
var httpContext = context.HttpContext;
...
}
您可以访问 DI 系统的任何其他地方(例如服务的构造函数,或者当您可以直接访问服务提供者时),您可以在当前请求的 ActionContext 处获得,但请注意,这仅在您处于在请求的范围内,您传入的服务提供者也在请求的范围内。
public MyService(IScopedInstance<ActionContext> contextAccessor)
{
_httpContext = contextAccessor.Value.HttpContext;
_routeData = contextAccessor.Value.RouteData;
}
注意:您也可以只编写自己的“访问器”,如果您希望它只是一个具有 get/set 属性并注册为 Scoped 服务的简单类。
【讨论】:
MyService 的实例是在Startup.cs 中创建的,如下所示:app.UseMvc(routes => { routes.Routes.Add(new DefaultRouter(routes.DefaultHandler,new DefaultRouteResolver(new RouteResolverTrie(DocumentStore, // I need to put the IContextAccessor here //)))); 此时是否可以使用Func<IContextAccessor<ActionContext>>,以便我可以为每个请求发送当前的IContextAccessor?
IActionContextAccessor