gpt4 book ai didi

concurrency - 并发使用MVC应用的Stack Empty问题

转载 作者:行者123 更新时间:2023-12-02 00:14:42 27 4
gpt4 key购买 nike

我们最近开发了一个新的 ASP.NET MVC 4 网络应用程序 (C#/Visual Studio)。经过本地测试和调试后,我们将其部署到生产环境中,然后开始收到越来越多的健康监控邮件。这些有不同的异常消息:

  • 清空堆栈。
  • 集合已修改;枚举操作可能无法执行。
  • 项目已经添加。字典中的键:'ALL_HTTP' 正在添加的键:'ALL_HTTP'(还提到了其他键)。
  • 值不在预期范围内。

例如我们无法简单地解决或重现的一系列错误类型。 “Stack Empty”是出现次数最多的错误,每天发生数百次(例如,对于 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 的 View (.cshtml 文件)中,然后在 @Html.RenderAction() 调用中。到目前为止,我们已经将其中很多重构为 RenderPartial() 调用。这导致堆栈跟踪中不再有 View ,尽管一些 RenderPartial 现在也提供了一些

搜索此错误表明并发/并行执行是原因。这符合我们最初无法在本地重现错误的事实,但它确实发生在生产中。我们没有进行负载测试,但现在已经能够通过同时启动大量应用程序/请求来在本地开发人员系统上重现错误。然而,在我们的代码中,没有使用显式并行指令完成任何事情。

这似乎与 MVC View 不是线程安全的有关。然而,很难想象没有其他人会遇到这种情况。我们每天有几千名访客,随时都有大约 30 多个活跃用户。遗憾的是,由于 Google 排名下降(与此问题相关),这个数字现在正在下降。

有谁知道这个问题的解决方案/方法吗?

最佳答案

我正在开发一个 ASP.NET MVC 4 应用程序,我也遇到了您提到的错误。尽管它们不同,但它们似乎具有相同的来源。在花了几个小时试图找到原因(以及大量代码更改)后,我从头开始分析。

因为我使用的是自定义路由,并且该路由有一个处理程序,可以检查几项内容并访问数据库,所以我从评论数据库访问开始。快速打开几个浏览器选项卡(使用 IISExpress > 显示所有应用程序窗口或通过 Ctrl+单击链接)我很高兴地看到所有页面都正确显示,而不是一些随机错误消息。尝试了几次以确保访问数据库时出现问题。

public class MyNewRouteHandler : IRouteHandler {

IHttpHandler MvcHandler;

public IHttpHandler GetHttpHandler(RequestContext requestContext) {
MvcHandler = new MvcHandler(requestContext);

// some checkings and
// some database access code
// that was commented

return MvcHandler;
}
}

一位同事建议我在这个方法中添加一个小线程休眠:GetHttpHandler。该行再次出现错误,表明问题与数据库无关......当我这样做时,我看到 MvcHandler 对象被定义为类属性,这可能是似乎是并发问题(仅当执行多个几乎连续的访问时,才会显示问题)。将 MvcHandler 对象移动到方法内的本地对象。

public class MyNewRouteHandler : IRouteHandler {

public IHttpHandler GetHttpHandler(RequestContext requestContext) {
IHttpHandler MvcHandler = new MvcHandler(requestContext);

// some checkings and
// some database access code
// that was commented

return MvcHandler;
}
}

经过测试,没有更多的错误。取消注释我访问数据库的所有代码(并进行其他检查)并且仍然没有发现更多错误。将近 3 天过去了,一切仍然正常。

关于concurrency - 并发使用MVC应用的Stack Empty问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13798726/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com