net mvc asp c# asp.net routing session-variables

c# - mvc - HttpContext.Current.Session es nulo cuando se enrutan solicitudes



variables de session c# mvc 4 (13)

¡Buen trabajo! He estado teniendo exactamente el mismo problema. Agregar y eliminar el módulo de sesión funcionó perfectamente para mí también. Sin embargo, no lo trajo HttpContext.Current.User, así que probé tu pequeño truco con el módulo FormsAuth y, efectivamente, eso fue todo.

<remove name="FormsAuthentication" /> <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>

Sin enrutamiento, HttpContext.Current.Session está allí, así que sé que StateServer está funcionando. Cuando ordeno mis solicitudes, HttpContext.Current.Session es null en la página enrutada. Estoy usando .NET 3.5 sp1 en IIS 7.0, sin las vistas previas de MVC. Parece que AcquireRequestState nunca se dispara cuando se utilizan las rutas y, por lo tanto, la variable de sesión no se crea / completa.

Cuando intento acceder a las variables de sesión, aparece este 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>.

Durante la depuración, también recibo el error de que HttpContext.Current.Session no es accesible en ese contexto.

-

Mi web.config ve así:

<configuration> ... <system.web> <pages enableSessionState="true"> <controls> ... </controls> </pages> ... </system.web> <sessionState cookieless="AutoDetect" mode="StateServer" timeout="22" /> ... </configuration>

Aquí está la implementación de IRouteHandler:

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; } }

También intenté poner EnableSessionState="True" en la parte superior de las páginas aspx, pero aún así, nada.

¿Alguna idea? ¿Debo escribir otro HttpRequestHandler que implemente IRequiresSessionState ?

Gracias.


Creo que esta parte del código realiza cambios en el contexto.

Page page = BuildManager.CreateInstanceFromVirtualPath( m_VirtualPath, typeof(Page)) as Page;// IHttpHandler;

También esta parte del código es inútil:

if (page != null) { return page; } return page;

Siempre devolverá la página marchita si es nula o no.


La sección de configuración parece sólida, ya que funciona si se accede a las páginas normalmente. He intentado con las otras configuraciones sugeridas, pero el problema sigue ahí.

Dudo que el problema esté en el proveedor de la sesión, ya que funciona sin el enrutamiento.



Lo que dijo @Bogdan Maxim. O cambie para usar InProc si no está usando un servidor de estado de sesión externo.

<sessionState mode="InProc" timeout="20" cookieless="AutoDetect" />

Busque here más información sobre la directiva SessionState.


Lo tengo. Bastante estúpido, en realidad. Funcionó después de que eliminé y agregué el SessionStateModule así:

<configuration> ... <system.webServer> ... <modules> <remove name="Session" /> <add name="Session" type="System.Web.SessionState.SessionStateModule"/> ... </modules> </system.webServer> </configuration>

Simplemente agregarlo no funcionará ya que "Session" ya debería haberse definido en machine.config .

Ahora, me pregunto si eso es lo habitual. Seguramente no parece así ya que parece tan crudo ...


Me faltaba una referencia a System.web.mvc dll en el adaptador de sesión, y al agregar el mismo solucioné el problema.

Con suerte, ayudará a alguien más a pasar por el mismo escenario.


Ninguna de las soluciones anteriores funcionó para mí. global.asax.cs el siguiente método en global.asax.cs luego Session no era nulo:

protected void Application_PostAuthorizeRequest() { HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required); }


Parece que olvidó agregar su dirección de servidor de estado en el archivo de config .

<sessionstate mode="StateServer" timeout="20" server="127.0.0.1" port="42424" />


Simplemente agregue el atributo runAllManagedModulesForAllRequests="true" a system.webServer/modules en web.config.

Este atributo está habilitado por defecto en MVC y proyectos de datos dinámicos.



una mejor solución es

runAllManagedModulesForAllRequest es una cosa inteligente que hacer respecto a la eliminación y la resinserting del módulo de sesión.

alk.


runAllManagedModulesForAllRequests=true es en realidad una solución realmente mala. Esto aumentó el tiempo de carga de mi aplicación en un 200%. La mejor solución es eliminar manualmente y agregar el objeto de sesión y evitar que todos los módulos administrados se ejecuten todos juntos.