2010-02-25 4 views
3

Je suis tout nouveau à ELMAH mais je travaille avec MVC depuis un petit moment maintenant. Après avoir lu plusieurs blogs sur le sujet, je poursuis la route d'avoir un ErrorController qui gère les pages 404 et unknown-error, et de faire une route par défaut qui transmet tous les chemins inconnus à l'action 404 sur ce contrôleur.Pourquoi est-ce que j'obtiens des entrées d'exception dupliquées en utilisant ELMAH dans ASP.NET MVC?

Le problème est que ELMAH enregistre chaque erreur deux fois; les journaux de détail sont complètement identiques à l'exception de leur numéro d'identification indiqué entre parenthèses dans le titre.

Est-ce que quelqu'un d'autre a rencontré cela? Le routage semble fonctionner en dehors de devoir abandonner la route {controller}/{action}/{id} par défaut.

Voilà ma configuration:

<configSections> 
     ... 
      <sectionGroup name="elmah"> 
       <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" /> 
       <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" /> 
       <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" /> 
       <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" /> 
      </sectionGroup> 
      ... 
    </configSections> 
    <system.web> 
     ... 
     <customErrors mode="On" defaultRedirect="~/error/unknown/"> 
       <error statusCode="404" redirect="~/error/notfound/"/> 
     </customErrors> 
     ... 
     <httpHandlers> 
     ... 
      <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah"/> 
     ... 
</httpHandlers> 
     ... 
     <httpModules> 
    ... 
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/> 
     </httpModules> 
    </system.web> 
    <system.webserver> 
      <modules runAllManagedModulesForAllRequests="true"> 
       ... 
       <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/> 
      </modules> 
      <handlers> 
       ... 
       <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
      </handlers> 
    </system.webserver> 
    <elmah> 
     <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/errorlogpath" /> 
    </elmah> 

et le code de routage:

routes.MapRoute(
     "ErrorDefault", 
     "error/{action}", 
     new { controller = "error", action = "unknown", id = "" } 
     ); 

    routes.MapRoute(
     "Default", 
     "{*url}", 
     new { controller = "error", action = "notfound", id = "" } 
     ); 

EDIT: VOICI ErrorController ainsi, juste pour mes fins de test:

/// <summary> 
/// Handles error page routing 
/// </summary> 
public class ErrorController : Controller 
{ 
    /// <summary> 
    /// Action for unknown errors 
    /// </summary> 
    /// <returns></returns> 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult Unknown() 
    { 
     Response.StatusCode = (int)HttpStatusCode.InternalServerError; 
     return View(); 
    } 

    /// <summary> 
    /// Action for 404s 
    /// </summary> 
    /// <param name="path"></param> 
    /// <returns></returns> 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult NotFound(string path) 
    { 
     Response.StatusCode = (int)HttpStatusCode.NotFound; 
     return View(); 
    } 
} 
+0

Où notez-vous réellement les erreurs? –

+0

J'utilise la méthode de consignation des erreurs qui stocke les erreurs localement dans les fichiers XML. –

+0

Ce que je voulais dire, c'est si c'est ErrorController qui signale les erreurs à Elmah, ou si le ErrorController montre juste une page d'erreur générique et que vous faites la signalisation ailleurs. –

Répondre

0

Pourquoi devez-vous abandonner la route par défaut?
Je vois que vous définissez un itinéraire ErrorDefault et un itinéraire catchAll, ce qui me semble redondant. Vous voudriez que l'itinéraire catchAll gère n'importe quelle route inconnue, donc vous voudriez définir l'erreur là dedans.

Vous pouvez essayer quelque chose comme:

// All other pages use the default route. 
routes.MapRoute("Default", "{controller}/{action}/{id}", 
    new { controller = "Applications", action = "Index", id = "" } 
); 

// Show a 404 error page for anything else. 
routes.MapRoute("Error", "{*url}", 
    new { controller = "Error", action = "notfound" } 
); 

la route redondante pourrait être la cause des doubles entrées dans le journal des erreurs?

Questions connexes