c# - 谁在调用错误 View ,为什么?

标签 c# asp.net asp.net-mvc asp.net-mvc-4 razor

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

有两个后续条目:

一个是:

Thread Id: 56, Message: Server_Exception - The view 'Error' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/OrganizationUser/Error.cshtml ~/Views/OrganizationUser/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml

第二个日志条目是:

Thread Id: 56, Message: Server_Exception - Stack Trace - at System.Web.Mvc.ViewResult.FindView(ControllerContext context) at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.b__22(IAsyncResult asyncResult) at System.Web.Mvc.Controller.<>c__DisplayClass1d.b__18(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.b__3(IAsyncResult ar) at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.b__3(IAsyncResult ar) at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.b__3(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.b__3(IAsyncResult ar) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, 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);
            }

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

enter image description here

发现/分析:

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

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

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

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

最佳答案

我怀疑你正在使用 System.Web.Mvc.HandleErrorAttribute因为此属性将尝试查找 Error View under certain conditions当在 Controller 操作中抛出异常时:

  1. 当前执行的 Action 不是子 Action
  2. 异常尚未处理启用自定义错误
  3. 包裹在 HttpException,异常有一个 500 HTTP 状态码
  4. 异常是 System.Exception 的一个实例

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

将所有这些放在一起,在您的一个 Controller 中,必须抛出满足上述所有要点的异常,在应用了 [HandleError] 属性的 Controller 操作中(也许它在全局范围内应用),它试图找到 Error View 但失败了。

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

关于c# - 谁在调用错误 View ,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28294112/

相关文章:

c# - .Net XmlSerializer 输出数据类型

c# - 反序列化嵌套的 json 字符串导致空值

c# - REST 服务,List 返回带有 ArrayOf 前缀

asp.net - 有没有办法访问 ASP.NET 中当前 session 的集合?

javascript - 当下拉列表中的项目发生更改时填充表格 razor mvc3

javascript - 启用了 CORS 但仍然得到 405

c# - SQL 连接和事务

c# - 如果是第一个或最后一个,则更改转发器 li 项目类

asp.net - System.Web.HttpException 无法加载类型 '[namespace].???'

asp.net - MVC4 - View 和 Controller 之间的关系