ASP.NET MVC应用程序随机崩溃

时间:2011-11-30 10:59:29

标签: asp.net-mvc production-environment

我创建了一个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。&lt;&gt; 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,IList 1 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)

此错误有时仅发生,并且可以抛出任何控制器的任何操作。 我想在一个特定的动作中找到原因,但它有时会抛出,并且可以抛出任何动作。

2 个答案:

答案 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()呈现的操作。

没有“随机”错误这样的事情 - 必须有它发生的情况,你只是不知道它,因为条件可能会有所不同。

您应该识别所有子操作,并使用各种输入对其进行测试..在确定有问题的输入集后,尝试逐个禁用子操作并以这种方式查找错误。