Ursachen: "Der Sitzungsstatus hat eine Sitzungs-ID erstellt, kann diese jedoch nicht speichern, da die Antwort bereits von der Anwendung gelöscht wurde."

80

Ich bekomme diesen Fehler zeitweise.

Ich habe diesen Link gefunden, der ziemlich gut zusammenfasst, was ich bei Google gefunden habe: http://www.wacdesigns.com/2009/02/03/session-state-has-created-a-session-id-but- kann es nicht speichern, weil die Antwort bereits von der Anwendung gelöscht wurde /

Grundsätzlich heißt es, Sie können versuchen, die Webkonfigurationseinstellung DisplayWhenNewSession festzulegen, oder versuchen, den Sitzungsstatus zum Leben zu erwecken, indem Sie die Session.SessionID in Session_OnStart abrufen.

Aber tut jemand:

a) eine Erklärung dafür haben

oder noch besser, b) eine bewährte Lösung haben

Mir ist klar, dass ich die Antwort nicht löschen kann, nachdem ich etwas getan habe, das den HTTP-Antwortheader beeinflusst. Wenn ich dies tun würde, würde es jedes Mal einen Fehler verursachen, aber dies ist zeitweise. Die SessionID sollte sicherlich von ASP.NET am Anfang der Seitenantwort automatisch erstellt werden, vor allem auf der ASPX-Seite oder dem Page Load (wo alle meine Flushes aufgerufen werden).

Update: Beim Nachdenken stelle ich fest, dass dies passiert, wenn eine Datei in den Browser gestreamt wird. Die meisten Browser sind tatsächlich Suchmaschinen-Bots. Ich kann diesen Fehler wiederherstellen, indem ich einen Download starte und dann den Browser schließe. Vermutlich warten die Browser also nicht auf den Abschluss des Downloads, bevor sie den Downloadvorgang abbrechen. Ich habe dies auch auf anderen, normalen Seiten gesehen, aber in 99% der Fälle handelt es sich um Download-Seiten.

mike nelson
quelle
1
Ich habe genau das gleiche Problem. Der einzige Grund, warum ich es überhaupt gesehen habe, war, als ich die Ausnahmebehandlung in Global.asax eingefügt habe. Es ist sehr zeitweise. Es wäre großartig, wenn jemand die Antwort darauf wüsste!
Scott Ferguson
6
Die Verbindung ist jetzt unterbrochen :-(
Casebash

Antworten:

84

Ich habe!

In der Datei global.asax gehen Sie folgendermaßen vor:

void Session_Start(object sender, EventArgs e) 
{
    // Code that runs when a new session is started
    string sessionId = Session.SessionID;
}

So einfach. Es klappt!

Eitama
quelle
Ist dies eine öffentliche / geschützte Methode - da sie privat ist, sollte sie geschützt werden. Ist das Beispiel vollständig, die Tatsache, dass die Sitzungs-ID nicht gespeichert ist, ist vermutlich in Ordnung - es ist die Auslösung der Erstellung, die wichtig ist, oder?
Chris Kimpton
Vielen Dank. Ich denke, dass dies im Allgemeinen funktioniert, daher werde ich es als akzeptierte Antwort markieren, obwohl ich nicht 100% sicher bin. Kann jemand bitte einen Kommentar abgeben, wenn er einen Fall findet, in dem dies nicht funktioniert? Vielen Dank.
Mike Nelson
Ich habe diese Methode einfach zu meiner global.asax-Datei hinzugefügt und meine Fehlermeldung, die mit der Frage identisch war, wurde entfernt. Vielen Dank, eitama!
vanhornRF
Dies hat mein Problem behoben (ich habe Flush erzwungen). Aber wissen Sie, warum dies als Lösung funktioniert?
Freundlich
Diese Antwort hat mir gerade viele Stunden gespart. Hätte es nie erraten. Vielen Dank!
HockeyJ
23

Dieser Fehler scheint aufzutreten, wenn:

  • Die Anwendung startet

  • Sie verwenden eine Global.asax, auch wenn Sie etwas in den Session_Start / End-Ereignissen tun oder nicht

  • Ihre Anwendung erzwingt das Spülen der Antwort zu früh

  • Sie verwenden die Sitzung nicht vor dem Flush

Es wird vom Sitzungsstatus ausgelöst, wenn versucht wird, die Sitzungs-ID bei der Veröffentlichung zu speichern:

System.Web.SessionState.SessionIDManager.SaveSessionID(HttpContext context, String id, Boolean& redirected, Boolean& cookieAdded)
System.Web.SessionState.SessionStateModule.CreateSessionId()
System.Web.SessionState.SessionStateModule.DelayedGetSessionId()
System.Web.SessionState.SessionStateModule.ReleaseStateGetSessionID()
System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs)
System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Ich glaube, dass das Vorhandensein von Global.asax dazu führt, dass die Sitzungs-ID bei der Veröffentlichung durch das SessionStateModule gespeichert wird (spät?), Selbst wenn beim Aufrufen der Sitzungs-ID keine Sitzung anstelle von HttpSessionState verwendet wurde.

Dies ist der Grund, warum der String sessionId = Session.SessionID; Trick vermeiden Sie das Problem.

Ich denke, es erscheint nur beim Start der Anwendung aufgrund des Initialisierungsverhaltens.

Lösungen / Tricks :

  • Vermeiden Sie das Spülen in Page Load wie bereits erwähnt

  • Sitzstatus auf der Seite deaktivieren (EnableSessionState)

  • Verwenden Sie den SessionID-Trick vor dem Flush

  • Verwenden Sie Response.End () anstelle von .Flush (), wenn Sie sich nicht für Fehler interessieren, die nach dem Flush auftreten können

JoeBilly
quelle
6

Ich glaube, das Problem hier kann genau sein, dass Sie etwas tun, um eine Seitenausgabe zu verursachen Page_Load, die laut ASP.NET Page Lifecycle Overview lange vor dem Rendern liegt.

Stellen Sie sicher, dass Sie erst nach der PreRenderPhase etwas tun, das die Seitenausgabe auslösen könnte .

cjs
quelle
Danke, ich werde mir das heute Abend ansehen. Nicht sicher, warum es zeitweise sein würde?
Mike Nelson
eine bedingte Antwort.Write () in einem unangemessenen Ereignis vielleicht?
Josh E
3

Nachdem ich gerade selbst auf dieses Problem gestoßen war, dachte ich, ich würde meine Erkenntnisse teilen.

Die web.config-Einstellung DisplayWhenNewSession ist irrelevant, da sie nur für eine bestimmte benutzerdefinierte Steuerung in Codeplex gilt (Entschuldigung, ich habe den Link verloren).

Der andere Vorschlag scheint zu funktionieren, indem die SessionId frühzeitig initialisiert wird. Ich habe mich mit Reflector in den Code eingegraben und konnte nicht genau erkennen, wie dies den Fehler hier verhinderte, aber es hat auf jeden Fall bei uns funktioniert!

Wie die meisten Leute, die anscheinend auf diesen Fehler stoßen, rufen wir Response.Flush () nirgendwo in der App explizit auf. Wir verwenden auch MVC für die Aufzeichnung.

Gaz
quelle
0

Ich erkenne, dass dies sehr alt ist, aber ich habe einen anderen Grund für den Fehler gefunden, der für andere gelten könnte. Wenn Sie MVC verwenden (ich habe MVC 4 mit .NET 4.0 verwendet) und Sie festlegen, dass Seiten mithilfe des web.config-Elements nicht gepuffert werden

<pages buffer="false">    

Wenn Sie dann in Ihrem Code versuchen, Daten in das Sitzungsobjekt zu übertragen, besteht möglicherweise das Risiko, dass dieser Fehler auftritt, wenn die Seite vor der untergeordneten Ansicht oder Aktion, die den Zugriff auf den Sitzungsstatus ausführt, gerendert wurde.

In solchen Fällen können Sie den Fehler beheben, indem Sie die obige Puffereinstellung auf true ändern. Alternativ können Sie Ihren Sitzungszugriffscode in die Hauptansicht und nicht in eine untergeordnete Aktion / untergeordnete Ansicht verschieben.

Mike Teye
quelle