2010-02-25 67 views
3

我是ELMAH的新手,但我一直在使用MVC一段时间。在阅读了关于这个主题的几篇博文之后,我正在寻求处理404和未知错误页面的ErrorController,并制作一条默认路由,将所有未知路径转发到该控制器上的404动作。为什么我在ASP.NET MVC中使用ELMAH获取重复的异常条目?

问题是,ELMAH记录每个错误两次;详细记录除标题中括号内的标识号外完全相同。

有没有其他人遇到过这个问题?路由似乎工作很大,除了必须排除默认的{controller}/{action}/{id}路由。

这里是我的配置:

<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> 

和路由代码:

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

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

编辑:这里的ErrorController为好,只是我的测试目的:

/// <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

你在哪里实际记录错误? – 2010-02-25 15:58:42

+0

我正在使用将错误本地存储在XML文件中的错误记录方法。 – 2010-02-25 15:59:53

+0

我的意思是如果ErrorController向Elmah发出错误信号,或者ErrorController只显示一个通用错误页面,并在其他地方发送信号。 – 2010-02-25 16:05:36

回答

0

为什么你是否必须抛弃默认路由?
我看到你正在定义一条ErrorDefault路线和一条catchAll路线,这对我来说似乎是多余的。你需要catchAll路由来处理任何未知的路由,所以你想在那里定义错误。

你可以尝试这样的:

// 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" } 
); 

能的冗余路径是在错误日志中的双项的原因是什么?

相关问题