HttpContext.Current.Session is null when routing requests
asp.net, c#, routes, session-variables
Solution
Got it. Quite stupid, actually. It worked after I removed & added the SessionStateModule like so:
<configuration>
...
<system.webServer>
...
<modules>
<remove name="Session" />
<add name="Session" type="System.Web.SessionState.SessionStateModule"/>
...
</modules>
</system.webServer>
</configuration>
Simply adding it won't work since "Session" should have already been defined in the `machine.config`.
Now, I wonder if that is the usual thing to do. It surely doesn't seem so since it seems so crude...
Problem
Without routing, `HttpContext.Current.Session` is there so I know that the `StateServer` is working. When I route my requests, `HttpContext.Current.Session` is `null` in the routed page. I am using .NET 3.5 sp1 on IIS 7.0, without the MVC previews. It appears that `AcquireRequestState` is never fired when using the routes and so the session variable isn't instantiated/filled. When I try to access the Session variables, I get this error: `base {System.Runtime.InteropServices.ExternalException} = {"Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive. Please also make sure that System.Web.SessionStateModule or a custom session state module is included in the <configuration>.` While debugging, I also get the error that the `HttpContext.Current.Session` is not accessible in that context. -- My `web.config` looks like this: ``` <configuration> ... <system.web> <pages enableSessionState="true"> <controls> ... </controls> </pages> ... </system.web> <sessionState cookieless="AutoDetect" mode="StateServer" timeout="22" /> ... </configuration> ``` Here's the IRouteHandler implementation: ``` public class WebPageRouteHandler : IRouteHandler, IRequiresSessionState { public string m_VirtualPath { get; private set; } public bool m_CheckPhysicalUrlAccess { get; set; } public WebPageRouteHandler(string virtualPath) : this(virtualPath, false) { } public WebPageRouteHandler(string virtualPath, bool checkPhysicalUrlAccess) { m_VirtualPath = virtualPath; m_CheckPhysicalUrlAccess = checkPhysicalUrlAccess; } public IHttpHandler GetHttpHandler(RequestContext requestContext) { if (m_CheckPhysicalUrlAccess && !UrlAuthorizationModule.CheckUrlAccessForPrincipal( m_VirtualPath, requestContext.HttpContext.User, requestContext.HttpContext.Request.HttpMethod)) { throw new SecurityException(); } string var = String.Empty; foreach (var value in requestContext.RouteData.Values) { requestContext.HttpContext.Items[value.Key] = value.Value; } Page page = BuildManager.CreateInstanceFromVirtualPath( m_VirtualPath, typeof(Page)) as Page;// IHttpHandler; if (page != null) { return page; } return page; } } ``` I've also tried to put `EnableSessionState="True"` on the top of the aspx pages but still, nothing. Any insights? Should I write another `HttpRequestHandler` that implements `IRequiresSessionState`? Thanks.