Session 如何在MVC5中从自定义路由库访问会话?

Session 如何在MVC5中从自定义路由库访问会话?,session,asp.net-mvc-5,asp.net-mvc-routing,session-variables,Session,Asp.net Mvc 5,Asp.net Mvc Routing,Session Variables,我正在尝试在ASP.NET MVC5中实现相对透明地加密ID的功能。我有一系列自定义HTML帮助程序,它们发出加密的ID,例如: html助手将密钥存储在会话范围中 然后,我有一个实现System.Web.Routing.RouteBase的类,GetRouteData方法应该用解密的id替换加密的id。如果我硬编码密钥,这是可行的,但是如果我将密钥存储在会话范围内并尝试访问它,会话总是空的 public override RouteData GetRouteData(HttpContextB

我正在尝试在ASP.NET MVC5中实现相对透明地加密ID的功能。我有一系列自定义HTML帮助程序,它们发出加密的ID,例如:

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

然后,我有一个实现System.Web.Routing.RouteBase的类,GetRouteData方法应该用解密的id替换加密的id。如果我硬编码密钥,这是可行的,但是如果我将密钥存储在会话范围内并尝试访问它,会话总是空的

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

有办法去参加会议吗?很明显,我对这里的生命周期并不了解

简而言之,你不能

在MVC中,
HttpContext.Session
在路由过程中还不可用-在应用程序的生命周期中还为时过早

MVC中会话状态可用的第一个点是在控制器创建阶段

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

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

  • 验证请求,该请求检查浏览器发送的信息,并确定其是否包含潜在的恶意标记。有关更多信息,请参阅ValidateRequest和脚本利用概述
  • 如果在Web.config文件的UrlMappingsSection部分中配置了任何URL,则执行URL映射
  • 引发BeginRequest事件
  • 引发AuthenticateRequest事件
  • 引发PostAuthenticateRequest事件
  • 引发AuthorizeRequest事件
  • 引发PostAuthorizerRequest事件
  • 引发ResolveRequestCache事件
  • 引发PostResolveRequestCache事件。(已执行路由)
  • 引发MapRequestHandler事件。根据请求的资源的文件扩展名选择适当的处理程序。处理程序可以是本机代码模块,如IIS 7.0 StaticFileModule,也可以是托管代码模块,如PageHandlerFactory类(用于处理.aspx文件)
  • 引发PostapRequestHandler事件
  • 引发AcquisiteRequestState事件。(已获取会话状态)
  • 引发PostAcquireRequestState事件
  • 引发PreRequestHandlerExecute事件
  • 为请求调用相应IHttpHandler类的ProcessRequest方法(或异步版本IHTTPassynchandler.BeginProcessRequest)。例如,如果请求是针对某个页面的,则当前页面实例将处理该请求。(控制器创建)
  • 引发PostRequestHandlerExecute事件
  • 引发ReleaseRequestState事件
  • 引发PostReleaseRequestState事件
  • 如果定义了筛选器属性,则执行响应筛选
  • 引发UpdateRequestCache事件
  • 引发PostUpdateRequestCache事件
  • 引发LogRequest事件
  • 引发PostLogRequest事件
  • 引发EndRequest事件
  • 引发PreSendRequestHeaders事件
  • 引发PreSendRequestContent事件

  • 请务必注意。

    很抱歉造成混淆。我想我想说的是,不管我如何访问它——无论是通过httpContext.Session还是静态方式,Session总是空的。