Freigabe von SQL Server-Sitzungsstatus über Web-Anwendungen

Ich bin die Einrichtung eines sehr einfachen demo von SQL Server-Sitzungsstatus, aber ich habe einige Mühe, es funktioniert. Ich bin versucht, dieses heraus zu testen lokal unter Windows 7 mit IIS 7.5 und SQL Server 2008 R2.

Letztlich, ich brauche einen Weg, um die Anzahl der Benutzer am system angemeldet hat, dass ein Lastenausgleich zwischen ein paar verschiedenen web-Servern. So brauche ich zum aktualisieren einer session-variable (gespeichert in SQL) jedes mal, wenn sich ein Benutzer anmeldet oder aus. Also die session-ID könnte immer anders sein. Ist das möglich?

Hier ist, was ich bisher getan habe:

  1. Erstellt zwei neue Websites in IIS (Site1 und Site2)
  2. Erstellt zwei neue Web-Application-Projekte in VS 2010 (Site1 und Site2)
  3. In beiden sites, auf die Standardeinstellung.aspx-Seite, die ich erstellt eine Schaltfläche, wenn darauf geklickt wird, speichern Sie entweder "Site1" oder "Site2" (je nach Standort) in einer session-variable mit dem Namen "LastSiteUsed". Es gibt eine andere Taste, wenn darauf geklickt wird, liest den Wert aus der "LastSiteUsed" session-variable und zeigen Sie es in einem label.
  4. In SQL, ich habe eine neue Datenbank namens dbSessionTest. Dann folgte ich den Anweisungen auf MSDN installieren der Sitzung-Status-Datenbank mit dem tool aspnet_regsql.
  5. In beiden meiner Web-Anwendung Web.config-Datei, die ich Hinzugefügt habe, die folgenden unter <System.Web>:

<sessionState mode="SQLServer" sqlConnectionString="server=.\sqlexpress;database=dbSessionTest;uid=myUsername;pwd=myPassword" cookieless="false" timeout="20" allowCustomSqlDatabase="true"/>

Beide Seiten normal funktionieren, aber Sie scheinen nicht zu teilen die Sitzung. Zum Beispiel, wenn ich auf meine Schaltfläche "speichern" meine session-variable von Standort1, würde ich erwarten, dass in der Lage sein zu Lesen, dass der Wert von Standort2, aber es funktioniert nicht. Site2 wird nur zurückgeben "Standort2" und Site1 erst wieder "Site1".

Hat jemand irgendwelche Ideen, was ich tun könnte falsch? Bin ich falsch im denken, dass ich sollte in der Lage zu Lesen, ein Wert von Standort1 aus Site2?

UPDATE:

Kann ich sehen, dass die session-Daten werden immer gespeichert, in der ASPStateTempSessions Tabelle im SQL-Management-Studio, aber jeder Standort kann immer noch nur das Wert, was er schrieb. Beide Seiten setzen der session-Variablen wie diese:

Session("LastSiteUsed") = "Site2"

Und beide Seiten sind abrufen der Werte wie:

lblValue.Text = "Value from Session: " & Session("LastSiteUsed").ToString

Muss ich tun, das anders für den Zugriff auf session-Variablen, die in SQL Server gespeichert werden?

UPDATE 2:

Ich habe versucht, mit den Standard-Datenbank ASPState, die erstellt wird, indem Sie folgenden Befehl ausführen:

aspnet_regsql.exe -S MyServerName -E -ssadd -sstype p

Dann vereinfacht jede meiner Websites.config-Dateien wie:

<sessionState mode="SQLServer" sqlConnectionString="Data Source=.\sqlexpress;User ID=myUsername;Password=myPassword" cookieless="false" timeout="20"/>

Aber wieder kein Glück. Ich möchte in der Lage sein, eine session-variable von Standort1 und Lesen Sie dann den Wert von Standort2, aber es funktioniert nicht. Wieder bin ich in der Lage, um zu sehen, Einträge, zeigt sich in der ASPStateTempSessions Tabelle, damit ich weiß, Sie sind immer richtig eingegeben. Eine Sache, die ich bemerkt ist, dass Sie unterschiedliche session-IDs?

Gibt es etwas, was muss ich anders machen um die gleiche session-ID wird zwischen meinen Seiten, wenn das setzen/Lesen der gleichen session-variable?

UPDATE 3:

Habe ich folgte den Anweisungen von dieser Artikel was ändert ein SP und fügt eine Spalte für die Gruppierung der ASPStateTempApplications Tabelle. Diese Art von gearbeitet, aber nur, wenn beide meiner Seiten wurden in der gleichen browser (mit tabs). Ich muss in der Lage sein zu öffnen Site1 im IE, einen Wert speichern zu meine session-variable, schließen Sie den browser, öffnen Sie Site2 in Chrom, und Lesen Sie den Wert ab. Von allem, was ich gelesen habe, mit SQL Server-Sitzungsstatus... sollte dies möglich sein.

UPDATE 4 - LÖSUNG:

Habe ich die Antwort auf dieser Artikel zur Verfügung gestellt von @SilverNinja. Ich neu erstellt, das ASPState Datenbank über die Eingabeaufforderung (rückgängig machen meine SP änderungen in Update #3) und dann modifiziert die TempGetAppID SP als pro die Antwort aus dem link. Ich habe auch aktualisiert, sowohl von meiner Web.config-Dateien entsprechend der Antwort, die Artikel wie gut:

<sessionState mode="SQLServer"
              sqlConnectionString="Data Source=.\sqlexpress;User ID=myUsername;Password=myPassword;Application Name=CacheTest"/>

Ich haben auch identische Maschine Schlüssel in beiden Web.config-Dateien:

<machineKey validationKey="59C42C5AB0988049AB0555E3F2128061AE9B75E3A522F25B34A21A46B51F188A5C0C1C74F918DFB44C33406B6E874A54167DFA06AC3BE1C3FEE8506E710015DB" decryptionKey="3C98C7E33D6BC8A8C4B7D966F42F2818D33AAB84A81C594AF8F4A533ADB23B97" validation="SHA1" decryption="AES" />

Nun bin ich in der Lage, (mit IE) öffnen, beide meiner Seiten, einen Wert von Standort1, und Lesen Sie es von Standort2 (und Umgekehrt). Wenn ich die Tabelle nur eine SessionID vorhanden ist (beide Seiten sind mit der gleichen session nicht richtig). Ich war falsch in meinem denken vor, dass das öffnen eines neuen browser (z.B. Chrome), würde die Verwendung der gleichen Sitzung einen neuen browser, wird es beginnen, die eigene Sitzung. Auf einer load-balanced-Szenario aber, das sollte keine Probleme verursachen.

  • Application Name=CacheTest ist die gleiche für alle Web-Anwendung (Webseiten) ? oder verschiedene Werte ?
InformationsquelleAutor lhan | 2012-10-29
Schreibe einen Kommentar