ASP.NET MVC, атрибут HandleError и трассировка: ошибка? - PullRequest
3 голосов
/ 20 июля 2009

Мне кажется, что при включенной трассировке в приложении ASP.NET MVC наблюдается странное поведение:

Когда включена трассировка, атрибут HandleError не выполняется.

Я воспроизвел это в ванильном приложении ASP.NET MVC, и мне было интересно, сталкивался ли кто-нибудь с подобным.

Шаги для воспроизведения

Шаг 1

Создание нового приложения ASP.NET MVC

Шаг 2

Включить трассировку в web.config:

<trace enabled="true" localOnly="false" pageOutput="false" requestLimit="500" traceMode="SortByTime" />

Шаг 3

На данный момент все работает отлично. Домашняя страница загружается:

http://localhost/MvcApplication2/

и страница трассировки работает:

http://localhost/mvcapplication2/trace.axd

Шаг 4

Имитировать исключение где-нибудь, где атрибут HandleError может его найти (действие контроллера, просмотр).

Я выдаю исключение в представлении Home\Index.aspx:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="System.Threading"%>

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2><%= Html.Encode(ViewData["Message"]) %></h2>
    <p>
        To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
        <% throw new NotImplementedException(); %>
    </p>
</asp:Content>

Результат

Вместо того чтобы получить представление, возвращаемое фильтром HandleError (Shared\Error.aspx), вместо этого я получаю ошибку ASP.NET CustomErrors:

http://localhost/mvcapplication2/GenericErrorPage.htm?aspxerrorpath=/MvcApplication2/

Копать глубже

Шаг 5

Отключить трассировку в web.config:

<!--<trace enabled="true" localOnly="false" pageOutput="false" requestLimit="500" traceMode="SortByTime" />-->

Результат

Представление фильтра HandleError (Shared\Error.aspx) возвращается правильно:

Извините, произошла ошибка во время обрабатывает ваш запрос.

Наблюдения

Возвращаясь к шагу 4 и выполняя некоторую отладку, выявляется:

  • HandleError вызывается правильно
  • Представление HandleError (Shared\Error.aspx) выдает ошибку, и именно поэтому мы отправляем в пользовательские ошибки ASP.NET

Спасибо, ELMAH, вот исключение, которое выбрасывает представление:

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.Web.HttpException: Multiple controls with the same ID 'ctl00' were found. Trace requires that controls have unique IDs.
   at System.Web.TraceContext.AddNewControl(String id, String parentId, String type, Int32 viewStateSize, Int32 controlStateSize)
   at System.Web.UI.Control.BuildProfileTree(String parentId, Boolean calcViewState)
   at System.Web.UI.Control.BuildProfileTree(String parentId, Boolean calcViewState)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   --- End of inner exception stack trace ---
   at System.Web.UI.Page.HandleError(Exception e)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest()
   at System.Web.UI.Page.ProcessRequest(HttpContext context)
   at ASP.views_error_internalerror_aspx.ProcessRequest(HttpContext context) in c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root\c3a94d6e\b487cfcc\App_Web_m5awwxof.0.cs:line 0
   at System.Web.Mvc.ViewPage.RenderView(ViewContext viewContext)
   at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
   at System.Web.Mvc.Controller.ExecuteCore()
   at System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

(Обратите внимание, что для этой трассировки мое представление HandleError называется "InternalError.aspx" вместо значения по умолчанию "Error.aspx")

ошибка

Итак, вопрос в том, могу ли я получить cookie-файл для обнаружения ошибки, или мне бьют форелью за то, что я пропустил что-то очевидное?

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 27 июля 2009

Как следствие этого:

Проблема по-прежнему существует, но в настоящее время я нашел обходной путь.

У меня есть определенный атрибут HandleError, потому что я подключаю ELMAH:

Как заставить ELMAH работать с атрибутом ASP.NET MVC [HandleError]? Как заставить ELMAH работать с атрибутом ASP.NET MVC [HandleError]?

В конце метода OnException я просто написал это:

filterContext.HttpContext.Trace.IsEnabled = false;

Благодаря программному отключению трассировки для этого запроса я могу избежать жесткого сбоя.

Так как исключение регистрируется в любом случае, я также не проигрываю, отключая трассировку.

...