如何从MVC5中的自定义RouteBase访问会话?

时间:2015-07-29 20:49:50

标签: session asp.net-mvc-5 asp.net-mvc-routing session-variables

我正在尝试实现在ASP.NET MVC5中相对透明地加密id的能力。我有一系列自定义HTML助手,它们会发出加密的ID,例如: http://url/CityDetails/Edit/Vb7B_slYoRdt1cQD5mNum

html助手将密钥存储在会话范围内。

然后,我有一个实现System.Web.Routing.RouteBase的类,并且方法GetRouteData应该用解密的id替换加密的id。如果我对密钥进行硬编码,则会起作用,但如果我将密钥存储在会话范围中并尝试访问它,则Session始终为null。

public override RouteData GetRouteData(HttpContextBase httpContext){
     //Session is always null
     HttpSessionState session1 = System.Web.HttpContext.Current.Session;
     ...
     return routeData;
}

有没有办法进入会话?我显然不了解这里的生命周期。

1 个答案:

答案 0 :(得分:3)

简而言之,你不能

在MVC中,HttpContext.Session在路由期间尚未可用 - 它在应用程序的生命周期中为时尚早。

MVC中会话状态可用的第一点是在Controller Creation阶段。

MVC 5 Application Lifecycle

有关MVC生命周期的更多信息,请参阅this MSDN article

如果您将其与ASP.NET on IIS 7 Lifecycle documentation对齐,则可以看到路由处理程序在PostResolveRequestCache事件中被调用。首先在AcquireRequestState事件中填充会话状态,然后在BeginProcessRequest事件中实例化控制器并执行操作。

  1. 验证请求,该请求检查浏览器发送的信息并确定其是否包含潜在的恶意标记。有关更多信息,请参阅ValidateRequest和Script Exploits Overview。
  2. 如果在Web.config文件的UrlMappingsSection部分中配置了任何URL,则执行URL映射。
  3. 提升BeginRequest事件。
  4. 提升AuthenticateRequest事件。
  5. 提升PostAuthenticateRequest事件。
  6. 提升AuthorizeRequest事件。
  7. 提升PostAuthorizeRequest事件。
  8. 提升ResolveRequestCache事件。
  9. 提升PostResolveRequestCache事件。 (已执行路由)
  10. 提升MapRequestHandler事件。根据所请求资源的文件扩展名选择适当的处理程序。处理程序可以是本机代码模块,例如IIS 7.0 StaticFileModule,也可以是托管代码模块,例如PageHandlerFactory类(处理.aspx文件)。
  11. 提升PostMapRequestHandler事件。
  12. 提升AcquireRequestState事件。 (会议状态获得)
  13. 提升PostAcquireRequestState事件。
  14. 提升PreRequestHandlerExecute事件。
  15. 为请求调用相应IHttpHandler类的ProcessRequest方法(或异步版本IHttpAsyncHandler.BeginProcessRequest)。例如,如果请求是针对页面的,则当前页面实例处理该请求。 (控制器创建)
  16. 提升PostRequestHandlerExecute事件。
  17. 提升ReleaseRequestState事件。
  18. 提升PostReleaseRequestState事件。
  19. 如果定义了Filter属性,则执行响应过滤。
  20. 提升UpdateRequestCache事件。
  21. 提升PostUpdateRequestCache事件。
  22. 提升LogRequest事件。
  23. 提升PostLogRequest事件。
  24. 提升EndRequest事件。
  25. 提升PreSendRequestHeaders事件。
  26. 提升PreSendRequestContent事件。
  27. 请注意它是generally not considered a good practice to use Session state with ASP.NET MVC