c# HttpContext.Current.Session è nullo durante le richieste di routing



asp.net session-variables (9)

Basta aggiungere l'attributo runAllManagedModulesForAllRequests="true" a system.webServer\modules in web.config.

Questo attributo è abilitato di default nei progetti MVC e Dynamic Data.

https://ffff65535.com

Senza instradamento, HttpContext.Current.Session è lì quindi so che StateServer funziona. Quando instrado le mie richieste, HttpContext.Current.Session è null nella pagina indirizzata. Sto usando .NET 3.5 sp1 su IIS 7.0, senza le anteprime MVC. Sembra che AcquireRequestState non venga mai AcquireRequestState quando si utilizzano i percorsi e quindi la variabile di sessione non viene istanziata / riempita.

Quando provo ad accedere alle variabili Session, ottengo questo errore:

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 il debug, ricevo anche l'errore che HttpContext.Current.Session non è accessibile in quel contesto.

-

Il mio web.config aspetto:

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

Ecco l'implementazione di 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;
    }
}

Ho anche provato a mettere EnableSessionState="True" nella parte superiore delle pagine di aspx ma ancora, niente.

Qualche intuizione? Dovrei scrivere un altro HttpRequestHandler che implementa IRequiresSessionState ?

Grazie.


Bel lavoro! Ho avuto lo stesso identico problema. L'aggiunta e la rimozione del modulo Sessione ha funzionato perfettamente anche per me. Tuttavia, non ha restituito HttpContext.Current.User, quindi ho provato il tuo piccolo trucco con il modulo FormsAuth e, di sicuro, lo ha fatto.

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

Fatto. Abbastanza stupido, in realtà. Ha funzionato dopo che ho rimosso e aggiunto il SessionStateModule in questo modo:

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

Semplicemente aggiungendolo non funzionerà poiché "Session" dovrebbe essere già stato definito in machine.config .

Ora, mi chiedo se è la solita cosa da fare. Sicuramente non sembra così dato che sembra così rozzo ...




Mi mancava un riferimento a System.web.mvc dll nella scheda di sessione, e aggiungendo lo stesso risolto il problema.

Speriamo che aiuti qualcun altro a superare lo stesso scenario.


Penso che questa parte del codice apporti modifiche al contesto.

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

Anche questa parte del codice è inutile:

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

Restituirà sempre la pagina wither è nullo o no.


Sembra che tu abbia dimenticato di aggiungere l'indirizzo del tuo server di stato nel file di config .

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

runAllManagedModulesForAllRequests=true è in realtà una soluzione davvero pessima. Ciò ha aumentato il tempo di caricamento della mia applicazione del 200%. La soluzione migliore è rimuovere e aggiungere manualmente l'oggetto di sessione ed evitare l'esecuzione di tutti gli attributi dei moduli gestiti tutti insieme.





session-variables