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>
Possiamo visualizzare le impostazioni web.config – Element
@Element aggiunto al post –
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