我创建了一个MVC 2应用程序,作为RSS Feeder工作,并为许多应用程序提供新闻内容。 一切都很好,直到昨天突然我的应用程序开始抛出一个随机错误,这并没有告诉我发生了什么(或者至少我不明白)。 此错误仅发生在生产中,无法在登台或本地计算机中重现。
这是堆栈跟踪:
执行处理程序的子请求时出错 “System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerWrapper'.errorPath:/ Android设备/版本/ 2011-11-22 / P1 HostIP:##。##。##。## at System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer,Boolean preserveForm,Boolean setPreviousPage, VirtualPath路径,VirtualPath filePath,String physPath,Exception error,String queryStringOverride)at System.Web.HttpServerUtility.Execute(IHttpHandler handler,TextWriter writer,Boolean preserveForm,Boolean setPreviousPage)at System.Web.HttpServerUtility.Execute(IHttpHandler handler,TextWriter writer,Boolean preserveForm)at System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer,Boolean preserveForm)at System.Web.Mvc.ViewPage.RenderView(ViewContext viewContext)at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) 在System.Web.Mvc.ControllerActionInvoker。<> c_ DisplayClass14.b _11() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter,ResultExecutingContext preContext,Func
1 continuation) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func
1 continuation)at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext,IList1 filters, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) at System.Web.Mvc.Controller.ExecuteCore() at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.b__4() at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.b__0() at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8
1.b__7(IAsyncResult _)at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤, 布尔和放大器; completedSynchronously)
此错误有时仅发生,并且可以抛出任何控制器的任何操作。 我想在一个特定的动作中找到原因,但它有时会抛出,并且可以抛出任何动作。
答案 0 :(得分:2)
此类 byzantine 错误很难调试。您看到的堆栈跟踪无法帮助诊断错误。
首先,您应该改进错误记录。在global.asax
中,创建Application_Error
挂钩的实现,将异常和所有内部异常记录到文件中(我不会将其记录到数据库中,因为数据库连接可能是罪魁祸首)。确保此代码是可靠的:它应该关注这些严重错误,而不是记录每404页。此外,请确保日志记录代码本身不会产生任何问题(它应该具有高度的容错能力)。
这类问题的原因通常是访问某种静态变量。在所有关键字中,我认为static
是迄今为止最危险的关键词,因为它非常微妙。
我见过的一些常见错误。
缓存有人想要聪明并将一些数据缓存在静态字典中。不幸的是,锁定代码存在缺陷。仅当某些用户的代码尝试添加某事时才会发生异常。到缓存,但它已经存在:
if(_dict.ContainsKey(cacheKey) == false)
{
// second thread adds data to the dictionary here
_dict.Add(cacheKey, cacheData); // exception
}
这也可能发生在使用缓存或池化的第三方库中。小心访问静态变量。
罕见的代码路径发生了一些不常见的事情,调用的代码经常不被调用,而且代码存在缺陷。如果您的测试代码覆盖率很高,请检查测试未涵盖的位置。
数据库连接丢失数据库连接上的套接字重置可能会导致异常。许多数据库连接库/驱动程序很快解决了这个问题(即下一个请求没问题)。这很难处理;基本上它不应该发生,但有很多原因可以发生。
答案 1 :(得分:1)
此错误告诉您,真正的错误是某些子操作中的某个位置,即Html.RenderAction()呈现的操作。
没有“随机”错误这样的事情 - 必须有它发生的情况,你只是不知道它,因为条件可能会有所不同。
您应该识别所有子操作,并使用各种输入对其进行测试..在确定有问题的输入集后,尝试逐个禁用子操作并以这种方式查找错误。