Warum kann ich den Sitzungsstatus zwischen 2 Webanwendungen mit StateServer nicht teilen? Was vermisse ich

Ich habe Probleme, zwei identische ASP.NET MVC-Anwendungen mit einem Session StateServer für dieselbe Sitzung zu verwenden. Der Grund, warum ich das versuche, ist, dass wir diese App irgendwann auf drei Webservern bereitstellen werden, die denselben Status haben müssen. Wir müssen StateServer verwenden, da wir versuchen, die Verwendung der Datenbank für nicht datenbezogenen Speicher zu minimieren.

Die Einrichtung

Ich habe die gleiche Codebasis für @ bereitgestellhttp: // localhost / App1 undhttp: // localhost / App2

both haben identische Web.Config-Dateien mit folgenden Eigenschaften:

<system.web>
<sessionState mode="StateServer" 
              cookieless="false" 
              timeout="20" 
              stateConnectionString="tcpip=127.0.0.1:42424" />
              //stateConnectionString="tcpip=192.168.1.52:42424" /> // also doesn't work
<machineKey 
  validationKey="8B9F68D0CC730F6F046D0173021C34B1A0D9A01C21D8E4D4A7A1DFF38332DEE8CBBAFEA503C18776614EE9D4F7EEA7E5D2D5571630547D822485A27B1EF53AC1"
  decryptionKey="60009563EFCFC594FD1BC46684943AA398EE70412A624B2EB488BBB071F15ECF"
  validation="SHA1" decryption="AES" />

Ich benutztedieses Tool zum Generieren dieser Maschinenschlüssel

Der Test

Ich habe Folgendes in einen meiner Controller gesteckt, um zu testen, ob es funktioniert hat:

ViewData["mode"] = requestContext.HttpContext.Session.Mode.ToString();

string timestamp = DateTime.Now.ToString();
if (requestContext.HttpContext.Session["timestamp"] == null)
{
    requestContext.HttpContext.Session["timestamp"] = timestamp;
}

ViewData["timestamp"] = requestContext.HttpContext.Session["timestamp"].ToString();
ViewData["realtime"] = timestamp;

mit diesem in der Ansicht:

<p>
    Mode: <%= ViewData["mode"].ToString() %>
</p>
<p>
    Time: <%= ViewData["timestamp"].ToString() %>
</p>
<p>
    real time: <%= ViewData["realtime"].ToString() %>
</p>

Das Ergebnis

Für beide Bereitstellungen kann ich beim ersten Laden der Seite feststellen, dass der Modus StateServer ist und der Zeitstempel auf die gleiche Zeit wie der Echtzeitwert gesetzt wird. Wenn dies jedoch funktioniert hat, sollte nur die erste Seite dieselbe Zeit haben als Echtzeitwert. Das Laden der zweiten Seite sollte vom StateServer lesen, da dieser Zeitstempelwert nicht mehr null ist, und diesen Zeitwert anzeigen. Stattdessen wird wieder der Echtzeitwert angezeigt.

Wenn ich die Seite aktualisiere, bleibt der Zeitstempel gleich und der Echtzeitwert wird immer aktualisiert. Dies weist darauf hin, dass der Zeitstempel in der Sitzung gespeichert wird, der Zeitstempelwert jedoch für beide Bereitstellungen immer unterschiedlich ist, wenn er gleich sein sollte. Dies weist also darauf hin, dass die Sitzung nicht freigegeben wird.

Kann jemand darauf hinweisen, ob ich etwas falsch mache oder ob ich noch etwas anderes tun muss, damit das funktioniert? Vielen Dan

Antworten auf die Frage(8)

Ihre Antwort auf die Frage