谁在调用错误视图,为什么?
Who is invoking Error view and why?
我得到了一个 MVC4 网络应用程序 运行 并且运行正常已经将近一年了。最近在查看生产错误日志时,我发现了很多相同类型的神秘异常条目。我检查了日志,发现这些异常发生在 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);
}
这里是数据库日志消息的快照:
Finding/Analysis:
由于错误只记录在远程服务器上,它告诉我它与 MVC 如何处理远程错误有关?自定义错误? - 我没有在 web.config 中定义它。我应该吗?
但主要问题是,是什么导致了错误的发生?谁在寻找视图名称错误?我知道你很难猜到,只是看我的运气。
另一个发现是在用户注销后记录异常。在我的登录获取表单中,我检查了 isAuthenticated,如果用户未通过身份验证,我会记录一条消息 'Request not authenticated, showing login form.' 并显示登录表单。我可以在上述异常消息之前看到这条消息。那么 login.cshtml 上发生了什么导致与服务器的联系产生错误?我检查了登录页面和 _Layout,其中嵌入了大量服务器端代码,但无法弄清楚是什么导致服务器尝试加载错误页面。
我认为 MVC 内部正在调用我的源代码中不存在的错误页面,因此出现这些异常。但是为什么是'Error'页呢?我想就在这种情况下要检查什么获得建议。如果您希望我分享任何可以帮助您理解我的问题的内容,请告知。
我怀疑您在控制器操作中抛出异常时使用 System.Web.Mvc.HandleErrorAttribute
as this attribute will attempt to look for an Error
view 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 模型实例的异常消息(如果当前用户具有适当的访问权限控制)。
我得到了一个 MVC4 网络应用程序 运行 并且运行正常已经将近一年了。最近在查看生产错误日志时,我发现了很多相同类型的神秘异常条目。我检查了日志,发现这些异常发生在 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);
}
这里是数据库日志消息的快照:
Finding/Analysis:
由于错误只记录在远程服务器上,它告诉我它与 MVC 如何处理远程错误有关?自定义错误? - 我没有在 web.config 中定义它。我应该吗?
但主要问题是,是什么导致了错误的发生?谁在寻找视图名称错误?我知道你很难猜到,只是看我的运气。
另一个发现是在用户注销后记录异常。在我的登录获取表单中,我检查了 isAuthenticated,如果用户未通过身份验证,我会记录一条消息 'Request not authenticated, showing login form.' 并显示登录表单。我可以在上述异常消息之前看到这条消息。那么 login.cshtml 上发生了什么导致与服务器的联系产生错误?我检查了登录页面和 _Layout,其中嵌入了大量服务器端代码,但无法弄清楚是什么导致服务器尝试加载错误页面。
我认为 MVC 内部正在调用我的源代码中不存在的错误页面,因此出现这些异常。但是为什么是'Error'页呢?我想就在这种情况下要检查什么获得建议。如果您希望我分享任何可以帮助您理解我的问题的内容,请告知。
我怀疑您在控制器操作中抛出异常时使用 System.Web.Mvc.HandleErrorAttribute
as this attribute will attempt to look for an Error
view 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 模型实例的异常消息(如果当前用户具有适当的访问权限控制)。