Au cours de nos différents développements web, nous avons été confrontés à l’erreur suivante :
L’état de session a créé un ID de session, mais il ne peut pas l’enregistrer, car la réponse a déjà été vidée par l’application.
———————————————————————-
2014/03/28 15:16:00 UNKNOWN
Message: [System.Web.HttpException]L’état de session a créé un ID de session, mais il ne peut pas l’enregistrer, car la réponse a déjà été vidée par l’application.
Trace: à 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.SessionState.SessionStateModule.OnEndRequest(Object source, EventArgs eventArgs)
à System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
à System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Target: Void SaveSessionID(System.Web.HttpContext, System.String, Boolean ByRef, Boolean ByRef)
Source: System.Web
Data:
——-
=======
Quand l’erreur apparaît-elle ?
Dans notre cas, l’erreur apparaît au premier chargement de l’application et plus particulièrement lors de la création d’une nouvelle session via la méthode « Session_Start » du Global.asax.
Cependant, l’erreur peut apparaître dans d’autres situations :
- Dans le cas de l’utilisation d’un fichier Global.asax (même si Session_Start et Session_End sont vides)
- L’application Flush la réponse, trop tôt…
- Vous n’utilisez pas la session avant le Flush
Qu’est-ce que cela signifie ?
La session n’est pas réellement créée tant que l’on ne stocke rien dedans, donc le cookie avec l’ID de session n’est pas envoyé au navigateur. En effet, tant que l’on ajoute rien dans la session pour la première fois, ASP.NET essaie d’envoyer le cookie, mais comme les en-têtes sont déjà partis, cela est impossible… d‘où l’erreur.
Comment résoudre ce problème ?
Dans notre situation stocker la « SessionID » dans une variable a suffi à la résolution de ce problème :
void Session_Start(object sender, EventArgs e){
// Code qui s’exécute lorsqu’une nouvelle session démarre
string sessionId = Session.SessionID;
//Le code …
}
Si cette solution ne corrige pas le problème, il suffit d’accéder à une variable session lorsque l’on n’est pas dans un AsyncPostback, par exemple dans le page_load :
void Page_Load(object sender, EventArgs e){
if (Session.IsNewSession) {
Session["SessionCorrective"] = true;
}
}
En espérant que cela vous soit utile !
I appreciate, cause I discovered just what I used to be looking for. You have ended my four day long hunt! God Bless you man. Have a nice day. Bye
Always rershfeing to hear a rational answer.
A big thank you for your article.Thanks Again. Great.
Merci !