2010-12-14 5 views
0

J'utilise ELMAH pour la journalisation des erreurs et si l'erreur survient pendant la publication partielle (à partir d'un gestionnaire d'événement d'un contrôle enveloppé dans un panneau de mise à jour), elle consigne les erreurs deux fois. Je n'utilise pas le module "MsAjaxDeltaErrorLog", mais enregistre par programme les erreurs du gestionnaire d'événements "AsyncPostBackError" du contrôle ScriptManager. Je fais cela pour éviter la redirection vers la page générique pour les erreurs survenues pendant les postbacks partiels. J'ai désactivé la redirection dans web.config. voici le code qui enregistre l'exceptionErreurs Ajax enregistrées deux fois par ELMAH

protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e) 
    { 
     HttpContext.Current.Items["AjaxError"] = "Ajax"; 
     ErrorSignal.FromCurrentContext().Raise(e.Exception,HttpContext.Current); 
    } 

    and in Global.asax, I am redirecting manually 

protected void ErrorLog_Logged(object sender, ErrorLoggedEventArgs e) 
{ 
    if (!HttpContext.Current.Items.Contains("AjaxError")) 
    { 
        var pageName = e.Entry.Error.StatusCode == 404 ? "FileNotFoundPage" : "GenericErrorPage"; 
        var redirectPage = ConfigurationManager.AppSettings[pageName]; 
        Response.Redirect(String.Format("{0}?ExceptionId={1}&ExceptionMessage={2}", redirectPage, Server.UrlEncode(e.Entry.Id), 
             Server.UrlEncode(e.Entry.Error.Message))); 
    } 
} 

Répondre

0

De site Elmah:
(http://code.google.com/p/elmah/wiki/MSAjax)

Problèmes potentiels

Malheureusement, le MsAjaxDeltaErrorLogModule est pas une solution parfaite . En raison de la façon dont fonctionne , il y a une possibilité extrêmement faible que les erreurs seront enregistrées deux fois dans ELMAH. Pour que cela , les valeurs suivantes doivent se produire:

  1. L'exception non gérée doit avoir lieu pendant une publication partielle
  2. Il doit se produire avant que la méthode OnInit de System.Web.UI.PageRequestManager est appelé.

Cela signifie que les deux modules standards Elmah et la MsAjaxDeltaErrorModule captureront l'exception.

En réalité, les chances de ce vont être assez mince. .NET Framework 3.5

Une version mise à jour de Microsoft Ajax était fournie avec la version 3.5 du .NET Framework . Cette nouvelle version a changé la manière dont les erreurs inattendues dans les PostBacks partiels ont été traitées, supprimant l'appel à Response.End. Par conséquent, si vous continuez à utiliser le MsAjaxDeltaErrorLogModule avec cette version du cadre, vous verrez toutes les erreurs non gérées en partielles postbacks être enregistrés deux fois dans ELMAH. *

Im sur la même position que vous êtes , et chaque fois que je reçois une erreur asyn, je reçois le problème enregistré, mais je suppose que nous sommes bloqués, sauf si nous modifions le code source d'ELMAH