Почему я получаю дубликаты записей об исключениях, используя ELMAH в ASP.NET MVC? - PullRequest
3 голосов
/ 25 февраля 2010

Я новичок в ELMAH, но я уже некоторое время работаю с MVC. После прочтения нескольких блогов на эту тему я продолжаю путь к ErrorController, который обрабатывает страницы 404 и страницы с неизвестными ошибками, и создаю маршрут по умолчанию, который перенаправляет все неизвестные пути в действие 404 на этом контроллере.

Проблема в том, что 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();
    }
}

1 Ответ

0 голосов
/ 17 марта 2011

Почему вы должны отказаться от маршрута по умолчанию?
Я вижу, что вы определяете маршрут 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" }
);

Может ли избыточный маршрут быть причиной двойных записей в журнале ошибок?

...