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.
quelle
Antworten:
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!
quelle
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
quelle
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
PreRender
Phase etwas tun, das die Seitenausgabe auslösen könnte .quelle
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.
quelle
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.
quelle