我正在尝试实现在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;
}
有没有办法进入会话?我显然不了解这里的生命周期。
答案 0 :(得分:3)
简而言之,你不能。
在MVC中,HttpContext.Session
在路由期间尚未可用 - 它在应用程序的生命周期中为时尚早。
MVC中会话状态可用的第一点是在Controller Creation阶段。
有关MVC生命周期的更多信息,请参阅this MSDN article。
如果您将其与ASP.NET on IIS 7 Lifecycle documentation对齐,则可以看到路由处理程序在PostResolveRequestCache
事件中被调用。首先在AcquireRequestState
事件中填充会话状态,然后在BeginProcessRequest
事件中实例化控制器并执行操作。
请注意它是generally not considered a good practice to use Session state with ASP.NET MVC。