【发布时间】:2016-12-07 12:09:01
【问题描述】:
我们有一个在 Azure 云服务 Web 角色中运行的 ASP.NET MVC 应用程序。 MvcApplication.Application_Start() 中有很多启动代码,包括数据库初始化等,这可能需要几分钟或更长时间才能运行。
有时,当角色实例启动时(无论是在部署时还是在重新启动后),应用程序第一次启动失败。我们可以从日志中看到Application_Start 触发,通过某种方式,然后从头开始。重复此过程几次后,应用程序通常会完成其启动例程并开始处理请求,但偶尔会进入看似永无止境的循环,对此唯一的解决方案是重新启动或重新映像角色实例。
我们没有看到记录的任何错误,Application_End 根本没有触发。 Serilog 的HttpRequestIdEnricher 每次触发Application_Start 时都会记录不同的请求ID,表明每次都有一个新的HttpContext.Current。在本地运行时,我从未见过这种行为,仅在 Azure 中。
有什么想法吗?
更新
这种行为似乎只有在网站上发出多个请求时才会发生。当生产中的角色实例重新启动时,它最常见(并且令人愤怒)发生; UAT 环境通常可以正常启动,但我可以通过在不同的浏览器选项卡中发出多个请求来引发此问题。我还尝试实现类似this 的东西 - 让WebRole.OnStart ping Web URL 以确保网站在退出之前正在运行 - 但这只能确保网站永远出现。
所以我的猜测是 IIS 是罪魁祸首:当 Application_Start 正在进行时收到新请求时,它似乎是在重新启动应用程序,而不是让原始请求完成。
【问题讨论】:
-
你能检查一下是否调用了Application_Error吗?
-
我们没有处理 Application_Error,但 Application_Start 中的所有内容都在一个 try/catch 块中,并记录了任何异常,所以我怀疑它会是。
标签: asp.net-mvc azure iis azure-cloud-services