Pregunta

Sin enrutamiento, HttpContext.Current.Session está ahí, así que sé que StateServer está funcionando. Cuando enruto mis solicitudes, null está AcquireRequestState en la página enrutada. Estoy usando .NET 3.5 sp1 en IIS 7.0, sin las vistas previas de MVC. Parece que 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>. nunca se dispara cuando se usan las rutas y, por lo tanto, la variable de sesión no se instancia / llena.

Cuando intento acceder a las variables de sesión, aparece este error:

web.config

Durante la depuración, también recibo el error de que EnableSessionState="True" no está accesible en ese contexto.

-

Mi HttpRequestHandler se 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 IRequiresSessionState en la parte superior de las páginas aspx, pero aún así, nada.

¿Alguna idea? ¿Debo escribir otro <=> que implemente <=>?

Gracias.

¿Fue útil?

Solución

Lo tengo. Bastante estúpido, en realidad. Funcionó después de que eliminé & Amp; agregó 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 " Sesión " ya debería haberse definido en machine.config.

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

Otros consejos

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

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

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

Ninguna de estas soluciones funcionó para mí. Agregué el siguiente método en global.asax.cs luego la sesión no era nula:

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

¡Buen trabajo! He tenido exactamente el mismo problema. Agregar y quitar el módulo de Sesión también funcionó perfectamente para mí. 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"/>

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 aquí para obtener más información sobre la directiva SessionState.

Parece que ha olvidado agregar la dirección de su servidor de estado en la config archivo.

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

La sección de configuración parece sólida, ya que funciona si se accede a las páginas normalmente. He probado 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.

Creo que esta parte del código hace 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, ya sea nula o no.

una mejor solución es

runAllManagedModulesForAllRequest es algo inteligente para hacer respecto a la eliminación y el módulo de sesión de inserción de resina.

alk.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top