Frage

Erster Beitrag zu Stackoverflow, ich hoffe auf tolles Feedback :)

Ich versuche derzeit, die Last auf unserer Website auszugleichen.Wir haben einen 2-Cluster-NLB auf Windows Server 2003 mit IIS 6 eingerichtet.

Beim Testen des Setups habe ich festgestellt, dass unsere Sitzung manchmal verloren geht.Eineinhalb Tage später ist hier das Ergebnis:

  1. Ja, unsere machine.config haben beide den gleichen Verschlüsselungs-/Entschlüsselungsschlüssel.
  2. Ja, die ID in iis metabase.xml ist für beide Maschinen gleich.Tatsächlich ist die gesamte Datei bis auf „AdminACL“ gleich.
  3. Beide Webanwendungen sind mit „StateServer“ eingestellt und beide zeigen auf denselben Computer.

Ab diesem Zeitpunkt liefert die Suche bei Google weniger Informationen und mögliche Lösungen.

Soweit ich weiß, gibt es kein bestimmtes Muster, das dieses Problem verursacht.Es passiert einfach ab und zu.

Beim Versuch, das Problem zu finden, habe ich festgestellt, dass eine Anfrage das ASP-Sitzungs-ID-Cookie an den Server gesendet hat, der Server es jedoch nicht der Benutzersitzung zugeordnet hat.

Also wurde die Anfragenummer x vom Client gesendet, mit dem Cookie wurde die Sitzung zugeordnet und alles verlief reibungslos.Die Anfragenummer x+1 wurde vom Client mit dem Cookie gesendet, aber die Sitzung wurde nicht gefunden.

Beide Anfragen wurden auf derselben Maschine in der NLB gestellt.

Hier ist ein Ausschnitt der asp Trace.axd:

1. Anfrage:

Anfrage Details Sitzungs -ID:j2ffvy45updpc52uhw1mbg55 Anfragetyp:Erhalten Sie Zeit der Anfrage:26.11.2008 14:58:06 Statuscode:200 Anfrage Codierung:Unicode (UTF-8) Antwortkodierung:Unicode (UTF-8)

Fordern Sie die Sammlung von Cookies an

Name Wertgröße

ASP.NET_SessionId j2ffvy45updpc52uhw1mbg55 42 AID 22 9

Sammlung von Antwort-Cookies

Name Wertgröße

Header-Sammlung

Namenswert

Cookie ASP.NET_SessionId=j2ffvy45updpc52uhw1mbg55;AID=22

2. Anfrage:

Anfragetyp:26.11.2008 14:58:08 Statuscode:
Anforderungskodierung:Unicode (UTF-8) Antwortkodierung:

Fordern Sie die Sammlung von Cookies an

Name Wertgröße

Sammlung von Antwort-Cookies

Name Wertgröße

AID=22

Wie Sie in der zweiten Anfrage sehen können, wird das Cookie vom Client gesendet, aber asp scheint die Cookies nie in seine „Request Cookies Collection“ aufzunehmen.Ich denke, das ist der Grund, warum die Sitzung nicht gefunden wird.

Warum wird das Cookie also nicht der Sitzung zugeordnet?Ist das das Problem?Liegt das Problem woanders?

Bitten Sie uns jederzeit um weitere Erläuterungen.

Vielen Dank an alle für Ihr Feedback.

JF

War es hilfreich?

Lösung

Endlich habe ich die Antwort auf mein Problem gefunden.Der Ursprung liegt im Anwendungscode (wie 99 % der „Fehler“ von Drittanbieter-Tools eines Programmierers).Ich habe beschlossen, es trotzdem zu posten, für den Fall, dass sich jemand in einem ähnlichen Szenario befindet.

Dieser Code war Teil der WebServiceRequester-Klasse.Die Webdienst-Requester-Klasse wurde beim Erstellen der Sitzung instanziiert und wird in der Sitzung gespeichert.Während der Erstellung initialisieren wir das Mitglied „m_webServiceURL“, und dieses Mitglied wird anschließend in der Sitzung gespeichert.Bei welchem ​​Wert dieses Mitglied initialisiert wurde, hing von einer Einstellung auf dem lokalen Computer ab.

Der wichtige Teil ist der Folgende:Die WebServiceRequester-Klasse enthält WebService-Objekte.WebService-Objekte können nicht in einer Sitzung gespeichert werden, sie sind in ASP nicht serialisierbar.Die Eigenschaft enthielt das Attribut [NonSerialized].Jedes Mal, wenn wir während eines Seitenlebenszyklus zum ersten Mal auf die Eigenschaft „WebService“ des Objekts zugegriffen haben, mussten wir eine neue erstellen und ihr die URL „m_webServiceURL“ zuweisen, die in der Sitzung gespeichert wurde.Sie sehen also, ein neues Webservice-Objekt, möglicherweise auf einem anderen Computer, was bedeutet, dass auf jedem Computer eine andere Einstellung vorliegt.

also hier ist, was passiert ist:Feld 29 wurde so eingestellt, dass auf den Webdienst unter localhost zugegriffen wird

Box 30 wurde für den Zugriff auf den Webdienst als 192.168.253.29 eingestellt.

Technisch gesehen sind beide auf derselben Maschine installiert.Aber hier ist ein Szenario:

Melden Sie sich bei Feld 29 an.m_webServiceURL ist in der Sitzung auf localhost gesetzt.

[hier eine Anfrage zu Feld 29]

Der NLB-Ausgleich bringt uns zu Box 30.Box 30 lädt seine Sitzung und erstellt ein neues Webservice-Objekt mit localhost als Webservice-Adresse.Feld 30 stellte die Anfrage an den falschen Webdienst, was zu einer Ausnahme „Session Expired“ führte.

Eines der Probleme beim Debuggen bestand darin, dass die lokale Kommunikation nicht mit dem Netzwerkmonitor aufgezeichnet wurde.

Was mich auf die Spur brachte, war, dass wir nie eine Ausnahme in der Protokollverfolgung von Box 29 protokolliert hatten, wie es hätte sein sollen.

Vielen Dank an alle für eure Vorschläge, es hat uns sehr gefreut.

Haben Sie einen guten Tag.JF

Andere Tipps

Nicht unbedingt eine Antwort auf Ihre Frage, aber haben Sie versucht, einen SQL-Server-basierten Session-Speicher verwenden? (Suche auf MSDN für die endgültige Skript anstatt das temporäre Skript, das mit asp.net bereitgestellt wird)

Ich habe „schlechte Dinge“ über den ausführbaren Sitzungsdienst gehört und daher nicht verwende es. Noch nie hatte jede Probleme Web mit der SQL Server-basierten Lösung Landwirtschaft though.

Leider ist es nicht unbedingt eine Antwort auf Ihr Problem, aber es sollte entweder (a) fixiert, oder (b) verengt es deutlich nach unten.

Nun, wenn Sie Visual Studio verwenden, könnte man zumindest testet es mit der MSDE (die abgespeckte Version von SQL Server, die mit Visual Studio kommt) ...

Es könnte helfen, State-Server Probleme ausschließen ...

, um den Datenbank-Ansatz hat seine eigenen Probleme. Ich glaube, Sie sollten in der Lage sein, Ihren bevorzugten Ansatz zu verwenden.

Vielleicht diese Sitzung Problem Artikel würde helfen?

oder " Fehlerbehebung Session verwandte Fragen in ASP.NET "

oder " Fehlerbehebung abgelaufen ASP.NET Session State und Ihre Optionen "

Ich werde lahm und wieder durchlaufen, den Vorschlag von MS SQL Server. Installieren von SQL Server Express, die auch für kommerzielle Nutzung ganz herunter ist kostenlos und es hat nur diese drei Nachteile, die nicht ein Problem für Sie in dieser Phase sein sollten:

  • Max 4 GB Größe Datenbank
  • Max 1-CPU-Kern verwendet
  • Max 1 GB RAM verwendet

Ein paar Punkte zu berücksichtigen:

  • Was ist die Last auf Ihrer Website? State-Server hat die Tendenz zum Absturz bringen, wenn eine große Anzahl gleichzeitiger Zugriffe gegenüber. Wir verwenden es nur in Szenarien, in denen wir eine wirklich kleine Anzahl von Benutzern haben (in den 10er, meist Backend-Systeme). Jedes Mal, wenn wir versuchen, es in der Produktion für Websites 1000 von Benutzern täglich dienen verwenden, wäre es was zu einem Verlust von Sitzungsdaten zum Absturz bringen.
  • Auf einen der Produktionsumgebungen wir verwalten, sind wir MSSQL 2005 Express mit den Sitzungen zu verwalten, hat die Seite 10K + Nutzer pro Tag und 200K + Seiten pro Tag. Dies ist ein empfehlenswertes Vorgehen bei Sitzung ist ein Muss und eng gekoppelt in Ihre Anwendung.

Wenn Sie an Benutzer MSSQL Express als Staat DB sind, denken Sie daran, dass es nicht mit SQL Server-Agent kommt Sinn kein Aufgaben Scheduler gibt es im Hintergrund laufen und Ihre abgelaufenen Sitzungen zu reinigen. Ich würde empfehlen, einen Scheduler und läuft die sauberen abgelaufenen Sitzungen gespeicherten Prozedur in regelmäßigen Abständen zu finden.

Viel Glück

Statt um mit SQL von Unordnung, senden Sie Ihre Tests direkt in einem Ihrer IIS-Knoten, um zu sehen, wenn Sie immer noch das gleiche Problem bekommen. Ich bin sicher, wenn Ihr nur eine kleine Anzahl von Tests durchführen State nicht das Problem sein wird.

Versuchen Sie, den Domain-Namen des ASP.NET_SessionId durch Code „.ihredomain.com“ -Einstellung. Standardmässig ist die ASP.NET_SessionId Cookie-Domain-Namen zum vollständigen Anwendung Pfad festgelegt. So kann dies einer der Gründe sein, warum das Cookie nicht auf Reisen.

z. Request.Cookies [ "ASP.NET_SessionId"]. Domain = ".ihredomain.com". Denken Sie daran, die erste „“ ist wichtig, in dem Domain-Namen.

Sie können dies tun, in der Httpmodule im AcquireRequestState Ereignisse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top