谁在调用错误视图,为啥?

Posted

技术标签:

【中文标题】谁在调用错误视图,为啥?【英文标题】:Who is invoking Error view and why?谁在调用错误视图,为什么? 【发布时间】:2015-02-03 08:09:15 【问题描述】:

近一年以来,我的 MVC4 Web 应用程序运行正常并正常运行。最近在查看生产错误日志时,我发现了很多相同类型的神秘异常条目。我检查了日志,发现这些异常发生在 Beta 和 Production 环境中,但不在本地(似乎是一个提示 - 请参阅下面的发现 1)。

有两个后续条目:

一个是:

线程 ID:56,消息:Server_Exception - 视图“错误”或其 没有找到主人或没有视图引擎支持搜索 地点。搜索了以下位置: ~/Views/OrganizationUser/Error.cshtml ~/Views/OrganizationUser/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml

第二个日志条目是:

线程 ID:56,消息:Server_Exception - 堆栈跟踪 - 在 System.Web.Mvc.ViewResult.FindView(ControllerContext 上下文)在 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext 上下文) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.c__DisplayClass25.b__22(IAsyncResult asyncResult) 在 System.Web.Mvc.Controller.c__DisplayClass1d.b__18(IAsyncResult asyncResult) 在 System.Web.Mvc.Async.AsyncResultWrapper.c__DisplayClass4.b__3(IAsyncResult ar) 在 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) 在 System.Web.Mvc.Async.AsyncResultWrapper.c__DisplayClass4.b__3(IAsyncResult 一只老鼠 System.Web.Mvc.MvcHandler.c__DisplayClass8.b__3(IAsyncResult asyncResult) 在 System.Web.Mvc.Async.AsyncResultWrapper.c__DisplayClass4.b__3(IAsyncResult 一只老鼠 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, Boolean & completedSynchronously)

从 global.asax.cs 中的 Application_Error() 记录异常,如下所示:

            var ex = Server.GetLastError();

            if (ex != null)
            
                logger.Log(string.Format("Server_Exception - 0", ex.Message), LogCategory.Error);
                logger.Log(string.Format("Server_Exception - Stack Trace - 0", ex.StackTrace), LogCategory.Error);
            

这是数据库日志消息的快照:

发现/分析

    由于错误只记录在远程服务器上,它告诉我它与 MVC 如何处理远程错误有关?自定义错误? - 我没有在 web.config 中定义它。我应该吗?

    但主要的问题是,是什么导致了错误的发生?谁在寻找视图名称错误?我知道你很难猜到,只是看看我的运气。

    另一个发现是在用户注销后记录了异常。在我的登录获取表单中,我检查 isAuthenticated,如果用户未通过身份验证,我会记录一条消息“请求未通过身份验证,显示登录表单”。并显示登录表单。我可以在上述异常消息之前看到此消息。那么 login.cshtml 上发生了什么会导致与服务器的联系产生错误?我检查了登录页面和 _Layout,其中嵌入了很多服务器端代码,但无法弄清楚是什么导致服务器尝试加载错误页面。

我认为 MVC 在内部调用了我的源代码中不存在的错误页面,因此出现了这些异常。但为什么是“错误”页面?我想就在这种情况下检查什么获得建议。如果您希望我分享任何可以帮助您理解我的问题的信息,请告知。

【问题讨论】:

在项目级别搜索“return View("Error")”或只搜索“View("Error")”,不带引号。我敢打赌你会受到 AccountController 的欢迎。 @rism - 你输了 ;).... 我实际上在解决方案中做了所有可能的组合。我怀疑它是调用错误视图的框架内部的东西。无论如何感谢您的建议。 谢天谢地,RussCam 以他最出色的答案来救援。 【参考方案1】:

我怀疑您正在使用System.Web.Mvc.HandleErrorAttribute,因为当控制器操作中引发异常时,此属性将尝试查找Error 视图under certain conditions

    当前执行的动作不是子动作 该异常尚未处理自定义错误已启用 当包裹在 HttpException 中时,异常具有 500 HTTP 状态代码 异常是System.Exception 的一个实例

当以上所有条件都成立时,System.Web.Mvc.HandleErrorAttribute 创建一个System.Web.Mvc.HandleErrorInfo 实例,将 ExceptionContext.Result 属性设置为ViewResult,默认情况下ViewName 属性设置为Error

将所有这些放在一起,在您的一个控制器中,必须在应用了 [HandleError] 属性的控制器操作中抛出满足上述所有点的异常(可能是全局应用),即试图找到Error 视图但没有找到。

要知道原始异常是什么,您可以将Error 视图放入您的解决方案中,并写出传递给视图的 HandleErrorInfo 模型实例的异常消息(如果当前用户具有适当的访问控制)。

【讨论】:

非常感谢.. @Russ Cam。我确实添加了一个全局过滤器。我得到了线索,我将使用您的建议进行验证并回来。谢谢。 @SBirthare 不用担心。让我们知道您的进展情况! 我已经通过使用日志消息实现自定义句柄错误属性并强制登录获取操作异常来验证您的观点。记录的错误消息是相似的。我现在在远程服务器上部署更改以查看实际异常是什么(导致调用 OnException 的原始异常)。 由于我通过实现 Application_Error 来处理异常,我认为我不需要 HandleError 属性。楼主你怎么看? @SBirthare Application_Error 是一个包罗万象的位置,用于处理可以在 ASP.NET 应用程序中处理的异常,包括 MVC,您可以实现类似 digitallycreated.net/Blog/57/… 的东西来这样做

以上是关于谁在调用错误视图,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥还调用 calloutAccessoryControlTapped 来点击注释视图?

当我从另一个视图控制器调用时,为啥我的表视图为零?

在 IOS 4.x 或更低版本中,将子视图添加到视图时不会调用 viewDidAppear 方法,为啥?

为啥在子视图中添加图层蒙版时需要调用 layoutIfNeeded()?

为啥 Django 模板模式匹配错误的视图并导致 NoReverseMatch 错误?

为啥 UICollectionView 在滚动其单元格的滚动视图后不再调用 didSelectItemAtIndexPath ?