76 votes

Ce qui provoque "L'état de session a créé un identifiant de session, mais ne peut pas l'enregistrer car la réponse a déjà été purgée par l'application."

Je suis de cette faute par intermittence.

J'ai trouvé ce lien qui résume assez bien ce que j'ai pu trouver sur Google: http://www.wacdesigns.com/2009/02/03/session-state-has-created-a-session-id-but-cannot-save-it-because-the-response-was-already-flushed-by-the-application/

Fondamentalement, il est dit que vous pouvez essayer le réglage de la configuration web de réglage DisplayWhenNewSession, ou d'essayer de coups de pied de l'état de la session chose dans la vie, par l'obtention de la Session.Id de session dans le Session_OnStart.

Mais personne ne:

a) avoir une explication pour cette

ou encore mieux, b) ont testé et corrigé

Je me rends compte que je ne peux pas vider la réponse après avoir fait tout ce qui aurait une incidence sur la tête de réponse http. Si j'ai fait ceci, cela provoque une erreur à chaque fois mais c'est intermittente. Le SessionID doit sûrement être créé par ASP.NET au début de la page de réponse automatique, avant quoi que ce soit dans la page ASPX ou le Page_Load (qui est l'endroit où tous mes bouffées de chaleur sont appelés).

Mise à jour: À la réflexion, je me rends compte de ce qui se passe lors de la diffusion d'un fichier vers le navigateur. La plupart des navigateurs sont en fait des robots des moteurs de recherche. Je peux recréer cette erreur par lancer un téléchargement, puis la fermeture du navigateur, donc vraisemblablement les navigateurs ne sont pas d'attente pour que le téléchargement se termine avant d'annuler l'opération de téléchargement. J'ai aussi vu cela sur d'autres, les pages normales, mais 99% du temps, c'est de téléchargement des pages.

82voto

eitama Points 635

J'ai!

Dans le fichier global.asax, procédez comme suit:

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

Si facile. Ça marche!

21voto

JoeBilly Points 2070

Cette erreur apparaît lorsque :

  • Le démarrage de l'application

  • Vous êtes à l'aide d'un Mondial.asax même si vous êtes en train de faire quelque chose dans le Session_Start / événements de la Fin ou pas

  • Votre demande de forces de la Chasse d'eau de la réponse trop vite

  • Vous n'êtes pas à l'aide de la Séance, avant de le rincer

Il est soulevé par l'état de la session quand il essayer de sauver le sessionID sur libération :

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)

Je crois que la présence de la Global.asax cause l'ID de session pour être sauvé à la libération par le SessionStateModule (fin?) même si aucune session n'ont été utilisés à la place de HttpSessionState quand SessionID est appelé.

C'est la raison pour laquelle string idsession = Session.SessionID; astuce pour éviter le problème.

Je suppose qu'il ne s'affiche au démarrage de l'application en raison de l'initialisation des comportements.

Solutions/astuces :

  • Éviter de rinçage dans le Page_Load comme déjà dit

  • Désactive l'état de session sur la page (EnableSessionState)

  • Utiliser le SessionID truc avant de le rincer

  • Utiliser La Réponse.Fin() à la place de .Flush() si vous n'avez pas de soins sur les erreurs qui peuvent survenir après votre chasse d'eau

6voto

Curt Sampson Points 10866

Je pense que le problème ici est peut-être précisément que vous faites quelque chose qui cause la sortie de la page pendant Page_Load , ce qui, selon la vue d'ensemble du cycle de vie d'une page ASP.NET, est bien antérieure à l'étape de rendu.

Assurez-vous de ne rien faire qui puisse déclencher la sortie de la page avant l'étape PreRender .

3voto

Gaz Points 1449

Ayant tout juste de rencontrer ce genre de problème moi-même, je pensais que je voudrais partager mes découvertes.

Le web.paramètre de configuration DisplayWhenNewSession est pas pertinent car il ne s'applique à un particulier customcontrol sur Codeplex (désolé j'ai perdu le lien).

L'autre suggestion semble fonctionner par l'initialisation de la SessionId tôt. J'ai fouillé dans le code à l'aide d'un Réflecteur et ne pouvait pas vraiment voir comment cela a empêché l'erreur ici, mais il a certainement travaillé pour nous!

Comme la plupart des gens qui semblent fonctionner en ce bug, nous ne sommes pas explicitement l'appel de Réponse.Flush() n'importe où dans l'application. Nous sommes également en utilisant MVC, pour l'enregistrement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X