我们最近开发了一个新的 ASP.NET MVC 4 Web 应用程序 (C#/Visual Studio)。经过本地测试和调试后,我们将其部署到生产环境中,然后开始收到越来越多的健康监控邮件。这些有不同的异常消息:
- 堆栈空。
- 收藏已修改;枚举操作可能无法执行。
- 项目已添加。字典中的键:'ALL_HTTP' 正在添加的键:'ALL_HTTP'(还提到了其他键)。
- 值不在预期范围内。
例如,我们无法简单解决或重现的一系列错误类型。'Stack Empty' 是发生最多的一个,每天有 100 次(例如,对于 1-10% 的用户),所以我们专注于这个,因为其他错误似乎相关。这是部分堆栈跟踪:
Exception information:
Exception type: System.InvalidOperationException
Exception message: Stack empty.
...
Stack trace: at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.Stack`1.Pop()
at System.Web.WebPages.TemplateStack.Pop(HttpContextBase httpContext)
如图所示,堆栈跟踪大部分完全位于 MVC 框架 (System.Web) 中。在我们自己的代码中,经常出现在某些堆栈跟踪中的唯一位置是请求 URL 的视图(.cshtml 文件),然后是 @Html.RenderAction() 调用。到目前为止,我们已经将其中很多重构为 RenderPartial() 调用。这导致堆栈跟踪中没有更多视图,尽管一些 RenderPartial 现在也给出了一些
搜索此错误表明并发/并行执行是原因。这符合我们最初无法在本地重现错误的事实,但它确实发生在生产中。我们没有进行负载测试,但现在已经能够通过同时启动大量应用程序/请求在本地开发人员系统上重现错误。然而,在我们的代码中,没有任何事情是通过显式并行指令完成的。
这似乎与 MVC 视图不是线程安全的有关。然而,很难想象没有其他人会遇到这种情况。我们每天有几千名访客,任何时候大约有 30 多个活跃用户。遗憾的是,由于谷歌排名下降(与此问题相关),这个数字现在正在下降。
有谁知道这个问题的解决方案/方法?