【问题标题】:Access the current RouteContext访问当前的 RouteContext
【发布时间】:2014-10-24 17:41:45
【问题描述】:

在 MVC 5 I 中,您可以使用 HttpContext.Current 访问 HttpContext。访问HttpContext 或更好的首选方式是什么,只有当前的RouteContext

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core


    【解决方案1】:

    RouteContext 不是您通常想要访问的对象。 MVC 使用它来指示路由是否已处理,因此不会流动。您可能想改为访问 RouteData

    这里有几种访问它的方法:

    在控制器上,您可以访问 - this.ActionContext.RouteDataHttpContext.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 =&gt; { routes.Routes.Add(new DefaultRouter(routes.DefaultHandler,new DefaultRouteResolver(new RouteResolverTrie(DocumentStore, // I need to put the IContextAccessor here //)))); 此时是否可以使用Func&lt;IContextAccessor&lt;ActionContext&gt;&gt;,以便我可以为每个请求发送当前的IContextAccessor
    • 当你有新的东西时,你选择退出 DI。因此,您可以做的是通过 context.RequestServices 从传递到您的路由的 HttpContext 获取当前服务提供者。但请注意,动作上下文在路由期间尚不可用,它仅在动作选择运行并选择动作后确定(发生在路由之后)。
    • 这不是正确的流程。您的路由在启动时无法访问,也无法注入。按照模板路线中的代码
    • 在较新的版本中,将 IContextAccessor 替换为 IScopedInstance
    • 在RC1中,你可以向DI请求IActionContextAccessor
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多