Мне кажется, что при включенной трассировке в приложении 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-файл для обнаружения ошибки, или мне бьют форелью за то, что я пропустил что-то очевидное?
Заранее спасибо за помощь!