2013-03-19 13 views
6

Ho implementato uno schema di richiesta di risposta come gestore Ajax. Per qualche motivo ha smesso di funzionare dopo aver lavorato bene per un paio di mesi. L'esame del problema ha mostrato che Context.Session[KEY] aveva perso il suo valore tra la richiesta di risposta e quella di risposta.La sessione IIS7 perde i suoi valori

ho messo Session_Start e Session_End (e pochi altri) metodi in Global.asax.cs con un po 'di registrazione lì e vedo un nuovo evento Session_Start essere licenziato con lo stesso ID di sessione e non c'era nessun caso Session_End

La domanda è: perché IIS perde i valori della sessione?

Aggiornamento: ho provato a passare alle sessioni SQLServer ma non si sono verificati cambiamenti nel comportamento. In rare occasioni le sessioni funzionano come previsto, non sono sicuro del perché. Ho provato tutte le guide per la risoluzione dei problemi di perdita di sessione

AGGIORNAMENTO 2: ho ridotto il problema a un cookie di sessione mancante, ma la modifica della configurazione di my.browsers non risolveva il problema dopo diversi tentativi. Quando chiamo il gestore di ajax da un browser, il cookie di sessione "ASP.NetSessionId" appare come previsto. Ho cambiato il nome del cookie nelle impostazioni di IIS sia per il sito che per il server su "SessionId" ma continuavo a vedere ASP.NET, anche dopo aver riavviato il server. Mi piacerebbe ancora dare la grazia a qualcuno che ha un'idea di cosa sta succedendo. Nel frattempo ho risolto questo problema impostando un cookie di sessione nel codice.

codice Pseudo per Login.ashx:

string login = GetParameter("login", context); 
string passhash = GetParameter("pass", context); 
string challenge = "" + Context.Session["CHALLENGE"]; 
if (!string.IsNullOrEmpty(challenge)) 
{ 
    // this is the 'response' part 
    string challengeResponse = Crypto.GetChallengeResponse(Challenge, UserFromDB.PassHash); 
    if (challengeResponse == passhash) 
    { 
    // Great success, challenge matches the response 
    Log.I("Success"); 
    return "SUCCESS"; 
    } 
    else 
    { 
    Log.W("Failed to respond"); 
    return "FAILED TO RESPOND"; 
    } 
} 
else 
{ 
    // if passed login or session-stored challenge are empty - issue a new challenge 
    challenge = "Challenge: "+ Crypto.GetRandomToken(); 
    Context.Session["CHALLENGE"] = challenge; 
    Log.I("Sent Challenge"); // this is what's in the log below 
    return challenge; 
} 

Ecco il registro, Sessione avviata appare con ogni chiamata, Session.Keys.Count rimane 0 anche se Session [ "Challenge"] avrebbe dovuto essere impostata:

// This is the challenge request: 
[] **Session started**: sr4m4o11tckwc21kjryxp22i Keys: 0 AppDomain: /LM/W3SVC/1/ROOT-4-130081332618313933 #44 
[] Processing: <sv> **MYWEBSITE/ajax/Login.ashx** SID=sr4m4o11tckwc21kjryxp22i 
[] Sent Challenge @Login.ashx.cs-80 

// this is the response, note that there's another Session started with the same id 
// and the session didn't keep the value ["CHALLENGE"], there are no session-end events either 
[] **Session started**: sr4m4o11tckwc21kjryxp22i Keys: 0 AppDomain: /LM/W3SVC/1/ROOT-4-130081332625333945 #93 
[] Processing: <sv> **MYWEBSITE/ajax/Login.ashx?login=MYLOGIN&pass=RuhQr1vjKg_CDFw3JoSYTsiW0V0L9K6k6==** 
[] Sent Challenge @Login.ashx.cs-80 >Session: sr4m4o11tckwc21kjryxp22i 

web di configurazione, sterilizzata

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <appSettings> 
    <add key="IncludeStackTraceInErrors" value="false" /> 
    </appSettings> 
    <connectionStrings> 
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" /> 
    <add name="MYConnection" connectionString="metadata=res://*…. and a bunch of other stuff that works" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 
    <system.web> 
    <compilation targetFramework="4.5"> 
     <assemblies> 
     <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     </assemblies> 
    </compilation> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> 
    </authentication> 
    <membership> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
     </providers> 
    </membership> 
    <profile> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
     </providers> 
    </profile> 
    <roleManager enabled="false"> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
     <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> 
     </providers> 
    </roleManager> 
    <pages controlRenderingCompatibilityVersion="4.0" /> 
    </system.web> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    </entityFramework> 
</configuration> 
+0

Possiamo visualizzare le impostazioni web.config – Element

+0

@Element aggiunto al post –

+0

Avere hai ispezionato la richiesta/risposta in uno strumento di debug del browser come Firebug?Qualsiasi [fonte immagine non valida] (http://stackoverflow.com/questions/12623691/session-variable-value-changes-between-page-processing-somehow?rq=1)? – Sumo

risposta

0

Qual è il valore predefinito per Idle Time-out? Se i tempi pool di app fuori la sessione va bye bye

See Application Pool (Impostazioni Avanzate) -> Idle Time-out

penso che il valore predefinito è cinque minuti.

Vedi this link for advice on setting the idle timeout

Si potrebbe anche verificarsi il problema se la macchina lavora come webGarden quando non è necessario; guarda i Processi di lavoro massimi, prova a impostarlo su 1 e ritestare

+0

Quello che succede è entro .5 secondi - richiede il token di sfida, invia la risposta. Il timeout è di 20 minuti. Verificherò i lavoratori massimi più tardi stasera ma credo che sia 5 e funzionava così per un po 'di tempo –

+0

Hai letto http://stackoverflow.com/questions/5118236/sessions-in-asynchronous-design? –

0

Posso vedere che stai usando un gestore a tale scopo che restituirebbe sempre null. È necessario implementare IReadOnlySessionState. Scopri http://www.hanselman.com/blog/GettingSessionStateInHttpHandlersASHXFiles.aspx

+0

Lo sto già facendo. Context.Session è sempre nullo se non si mette l'interfaccia nella classe def –

+0

@StenPetrov hai provato IRequiresSessionState invece di IReadOnlySessionState? – jbl

+0

IRequiresSessionState è ciò che viene utilizzato, IReadOnlySessionState era qualcosa che ho provato molto presto. Il cookie di sessione dovrebbe funzionare con entrambi –

0

Aggiungi IRequiresSessionState al implimentation gestore

ex

public class handler_name: IHttpHandler, IRequiresSessionState