我有一个 Windows 2008 R2 服务器和一个在 IIS 的默认网站上运行的 ASP.Net 2.0 Web 应用程序,使用经典 .NET AppPool。下面我有一个使用 ASP.NET v4.0 集成管道 AppPool 运行 MVC 3 的虚拟应用程序。
在应用程序池自动回收后,MVC 虚拟应用程序每隔一段时间就会失败。修复方法是手动回收 ASP.NET 4.0 AppPool。我只需要回收一次,它总能解决问题。
我收到的应用程序错误看起来像是程序集未正确加载时出现的错误。它们由控制器NullReferenceException
和Object reference not set to an instance of an object
视图模型组成。
问题是我无法按需重现此问题以正确调试问题。我曾认为应用程序池回收的顺序可能是一个问题,因此我将经典池设置为每晚凌晨 1 点重新启动,集成池在凌晨 1:15 重新启动。不幸的是,这并没有帮助。
这个关于按需加载程序集的答案很有趣,但是我不确定为什么该错误很少发生,而且似乎是随机发生的。
有没有人知道我将如何能够始终如一地重现问题和/或潜在的解决方案?谢谢你。
更新以包含示例堆栈跟踪:
Exception information:
Exception type: NullReferenceException
Exception message: Object reference not set to an instance of an object.
at Bookstore.Controllers.BooksController.<>c__DisplayClass78.<Details>b__76(Grade g)
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
at Bookstore.Controllers.BooksController.Details(String booktitle)
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.<BeginInvokeAction>b__20()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult)
at System.Web.Mvc.Controller.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__4(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)