Utilisation d'ELMAH avec ASP.NET AJAX
Cette page décrit le module MsAjaxDeltaErrorLogModule introduit avec ELMAH 1.0 BETA 3.
Le problème
La première version d'ASP.NET AJAX, écrite avec la version 2.0 du .NET Framework (v1.0.61025.0), n'est malheureusement pas entièrement compatible avec ELMAH. Lorsqu'une exception non gérée se produit lors d'un postback partiel, le code d'origine l'intercepte et appelle sans ménagement Response.End(), empêchant ELMAH de la capturer. Ce code est visible depuis Reflector en consultant la méthode System.Web.UI.PageRequestManager.OnPageError dans System.Web.Extensions.dll :
La solution
Pour résoudre ce problème, vous pouvez ajouter le module MsAjaxDeltaErrorLogModule à votre application comme suit :
<httpModules>
<!--
Cette entrée est réservée à l'utilisation d'ASP.NET AJAX v1.0.x.x et à la capture des
erreurs lors des postbacks partiels. Elle n'est pas requise pour la version d'ASP.NET AJAX
fournie avec .NET Framework v3.5 !
-->
<add name="MsAjaxDeltaErrorLog" type="Elmah.MsAjaxDeltaErrorLogModule, Elmah"/>
</httpModules>
Ce module vérifie si la requête en cours est un PostBack partiel et, si tel est le cas, configure un gestionnaire alternatif pour capturer toute exception non gérée.
Problèmes potentiels
Malheureusement, le module MsAjaxDeltaErrorLogModule n'est pas une solution idéale. De par son fonctionnement, il existe une très faible probabilité que des erreurs soient journalisées deux fois dans ELMAH. Pour que cela se produise, les conditions suivantes doivent être réunies :
- L'exception non gérée doit se produire lors d'un postback partiel. Elle doit se produire avant l'appel de la méthode OnInit de System.Web.UI.PageRequestManager.
- Cela signifie que les modules ELMAH standard et MsAjaxDeltaErrorModule captureront l'exception.
En réalité, les chances que cela se produise sont assez minces.
.NET Framework 3.5
Une version mise à jour de Microsoft Ajax a été fournie avec la version 3.5 de .NET Framework. Cette nouvelle version a modifié la gestion des erreurs inattendues dans les postbacks partiels, en supprimant l'appel à Response.End. Par conséquent, si vous continuez à utiliser le module MsAjaxDeltaErrorLogModule avec cette version du cadre d'application, toutes les erreurs non gérées dans les postbacks partiels seront journalisées deux fois dans ELMAH.