谁在调用错误视图?为什么?

时间:2015-02-03 08:09:15

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

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

后续有两个条目:

一个是:

  

线程ID:56,消息:Server_Exception - 视图'错误'或其   未找到master或没有视图引擎支持搜索   位置。搜索了以下位置:   〜/查看/ OrganizationUser / Error.cshtml   〜/ Views / OrganizationUser / Error.vbhtml~ / Views / Shared / Error.cshtml   〜/查看/共享/ Error.vbhtml

第二个日志条目是:

  

线程ID:56,消息:Server_Exception - 堆栈跟踪 - at   System.Web.Mvc.ViewResult.FindView(ControllerContext context)at   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)   在   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)在System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult   asyncResult)at   System.Web.Mvc.Async.AsyncResultWrapper<> c__DisplayClass4.b__3(IAsyncResult的   一只老鼠   System.Web.Mvc.MvcHandler<> c__DisplayClass8.b__3(IAsyncResult的   asyncResult)at   System.Web.Mvc.Async.AsyncResultWrapper<> c__DisplayClass4.b__3(IAsyncResult的   一只老鼠   System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,   布尔和放大器; 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如何处理远程错误有关?的customErrors? - 我没有在web.config中定义它。我应该吗?

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

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

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

1 个答案:

答案 0 :(得分:3)

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

  1. 当前正在执行的操作不是子操作
  2. 尚未处理启用自定义错误
  3. 的异常
  4. 当包含在 HttpException 中时,该异常有500个HTTP状态代码
  5. 例外是System.Exception
  6. 的一个实例

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

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

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