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


第三步

此时一切正常。主页加载:

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,还是因为缺少明显的东西而被鳟鱼打了?

预先感谢您的帮助!

最佳答案

作为此的后续措施:

该问题仍然存在,但与此同时,我已经实施了变通方法。

我定义了一个自定义的HandleError属性,因为我要插入ELMAH:

如何使ELMAH与ASP.NET MVC [HandleError]属性配合使用?
How to get ELMAH to work with ASP.NET MVC [HandleError] attribute?

OnException方法的末尾,我简单地输入以下内容:

filterContext.HttpContext.Trace.IsEnabled = false;


通过以编程方式禁用对该请求的跟踪,我可以避免严重崩溃。

由于无论如何都会记录异常,因此我也不会因关闭跟踪而失败。

10-05 18:15