我有一个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);
}
以下是数据库日志消息的快照:
查找/分析:
由于错误仅记录在远程服务器上,它告诉我它与MVC如何处理远程错误有关?的customErrors? - 我没有在web.config中定义它。我应该吗?
但主要问题是,是什么导致错误发生?谁在寻找视图名称错误?我知道你很难猜到它,但只是检查我的运气。
另一个发现是用户注销后会记录异常。在我的登录获取表单中,我检查isAuthenticated,如果用户未经过身份验证,我会记录一条消息“请求未经过身份验证,显示登录表单”。并显示登录表单。我可以在上面的异常消息之前记录此消息。那么在login.cshtml上发生了什么导致与服务器联系而产生错误?我检查了登录页面和_Layout,其中嵌入了大量服务器端代码,但无法弄清楚可能导致服务器尝试加载错误页面的原因。
我认为内部MVC正在调用我的源代码中不存在的错误页面,因此这些异常。但为什么'错误'页面?我想在这种情况下获得有关检查内容的建议。请告知您是否希望我分享任何可以帮助您理解我的问题的内容。
答案 0 :(得分:3)
我怀疑您使用的是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模型实例的异常消息(如果当前用户具有相应的访问控制)