Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

BUG : Microsoft ASP.net Ajax - UpdatePanel et Session (PageRequestManagerParserErrorException)

Suite à ce post expliquant les causes de l'erreur PageRequestManagerParserErrorException j'ai reçu une question qui ne se résolvait pas malgré les indications données. En analysant la réponse HTTP qui pose problème avec Fiddler on se rend compte que le flux HTTP était bel et bien modifié. En effet le détail d'une erreur ASP.net est écrit à la fin de la réponse. Voici le message d'erreur ainsi que le stack trace.

[HttpException (0x80004005): 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.]
   System.Web.SessionState.SessionIDManager.SaveSessionID(HttpContext context, String id, Boolean& redirected,
Boolean& cookieAdded) +163 System.Web.SessionState.SessionStateModule.CreateSessionId() +78 System.Web.SessionState.SessionStateModule.DelayedGetSessionId() +97 System.Web.SessionState.SessionStateModule.ReleaseStateGetSessionID() +30 System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs) +681 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +167 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +117

En anglais le message d'erreur est "Session state has created a session id, but cannot save it because the response was already flushed by the application."

N'ayant pour l'instant pas la moindre idée d'où peut provenir l'erreur, je lance le meilleur ami du développeur pour analyser cette méthode SaveSessionID. Voici ce que me dit Reflector :

if (!context.Response.IsBuffered()) { throw new HttpException(SR.GetString("Cant_save_session_id_because_response_was_flushed")); }

A partir de là j'ai compris l'erreur. En interne, lors d'un AsyncPostback, ASP.net appelle la méthode Response.Flush() ce qui a pour effet d'envoyer au client tout le contenu du buffer c'est à dire le début de la réponse HTTP. On ne peut donc plus modifier le header de la requête ! Je me souviens très bien de l'appel à la méthode Flush() car cela m'avait déjà poser pas mal de problème lorsque j'avais implémenté l'upload avec Ajax et UpdatePanel. Je me suis posé la question du pourquoi et je n'ai pas trouvé de réponse valable ...

Mais revenons à nos moutons. Quelle est le rapport entre les sessions et la méthode Flush ? En fait lorsque vous utilisez pour la première fois une variable session, ASP.net va écrire un cookie dans le header de la réponse HTTP, header qui a déjà été envoyé au client suite au Flush() ...

Le code suivant déclenche donc une exception, car vous essayez d'accéder pour la première fois à une variable session lors d'un AsyncPostback.  

<script type="text/C#" runat="server"> void btn1_Click(object sender, EventArgs e) { Session["dummy"] = "bug"; } </script> <asp:UpdatePanel ID="up1" runat="server"> <ContentTemplate> <%=DateTime.Now.ToLongTimeString()%> <asp:Button ID="btn1" runat="server" Text="go" OnClick="btn1_Click" /> </ContentTemplate> </asp:UpdatePanel>

Pour corriger 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["ASP.NetAjaxIsReallyStupid"] = true; } }

Ainsi la session sera créé lors d'une requête classique, le cookie sera donc correctement définit et il n'y aura pas de soucis pour définir une variable session lors d'un AsyncPostback puisqu'il ne sera pas nécessaire de redéfinir le cookie.

Posted: lundi 18 juin 2007 21:38 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01