2008-10-20 41 views
41

Sin enrutamiento, HttpContext.Current.Session está allí, así que sé que el 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 usan las rutas y, por lo tanto, la variable de sesión no se crea/completa.HttpContext.Current.Session es nulo cuando se enrutan solicitudes

Cuando intento acceder a las variables de sesión, me sale 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 me sale el error de que el HttpContext.Current.Session no es accesible en este contexto.

-

Mi web.config se parece a esto:

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

Aquí está la aplicación 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 he intentado poner EnableSessionState="True" en la parte superior de las páginas aspx pero aún así, nada.

¿Algún conocimiento? ¿Debo escribir otro HttpRequestHandler que implemente IRequiresSessionState?

Gracias.

Respuesta

52

Lo tengo. Bastante estúpido, en realidad. Se trabajó después quité & añade el SessionStateModule así:

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

Simplemente añadiendo que no funcionará, ya que "sesión" ya debería haber sido definido en el machine.config.

Ahora, me pregunto si eso es lo que se suele hacer. Seguramente no parece ser así ya que parece tan crudo ...

+3

Gracias por esto. Resolvió mi problema muy bien, ya que resultó que el servidor de producción lo necesitaba pero no la máquina de desarrollo. – Raithlin

+2

¡Eso es ins @ ne! Gracias. Esto corrigió la eliminación de los valores de mi "TempData" (maquinilla de mvc) (ya que TempData usa Session). Holy Moly. – granadaCoder

+0

Tengo el problema de la desaparición de los valores de TempData, pero esto no lo resolvió. – Dinei

0

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

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

Lo intenté pero sigue igual. Realmente no debería importar con su valor predeterminado: "tcpip = loopback: 42424" (http://msdn.microsoft.com/en-us/library/system.web.configuration.sessionstatesection.stateconnectionstring.aspx) Dudo que el problema esté en el proveedor de la sesión, ya que funciona sin el enrutamiento. – Loki

0

La sección de configuración de sonido parece como si funciona normalmente cuando se accede a las páginas. 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.

2

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" /> 

Look here para obtener más información sobre la directiva SessionState.

+0

SessionState funciona si tengo acceso a la página normalmente. Si uso el enrutamiento, HttpContext.Current.Session es nulo. La sección parece estar funcionando en la configuración. – Loki

0

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 va a devolver la página marchitan es nulo o no.

+0

Gracias por recordarme. Ese fue un código vestigial después de probar tantas cosas. : D – Loki

3

¡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"/> 
23

Simplemente añadir el atributo runAllManagedModulesForAllRequests="true"-system.webServer\modules en web.config.

Este atributo está habilitado de forma predeterminada en proyectos MVC y Datos dinámicos.

+1

¡Impresionante! esta es la respuesta que estaba buscando ... mucho mejor que la aceptada. –

+6

Lea algunos comentarios sobre shanselman para saber por qué rammfar puede ser perjudicial para su salud (del servidor): http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx – Peter

+0

Funcionó para mí, pero sí, lea el enlace proporcionado por @Peter. –

1

una mejor solución es

runAllManagedModulesForAllRequest es una cosa inteligente de hacer el respeto y la eliminación de resinserting módulo de sesión.

alk.

14

runAllManagedModulesForAllRequests=true es realmente una mala solución. 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.

0

me faltaba una referencia a System.Web.Mvc DLL en el adaptador de la sesión, y la adición de la misma fija el problema.

Esperemos que ayude a alguien más a pasar por el mismo escenario.

+0

¿Qué significa esto? ¿Cuáles son los pasos para hacer esto? – paulwhit

+0

Lo siento, no pude entender su pregunta. ¿De qué pasos estás hablando? Agregué una referencia a "System.web.mvc dll" haciendo clic derecho en las referencias en el proyecto mvc dentro de visual studio –

1

Ninguna de las soluciones anteriores funcionó para mí. Agregué el siguiente método en global.asax.cs y la sesión no fue nula:

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

Muchas gracias. ¡Esto funcionó para mí! :) –

Cuestiones relacionadas