【问题标题】:Application_Start loops when Azure web role starts upAzure Web 角色启动时 Application_Start 循环
【发布时间】: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


【解决方案1】:

我似乎已将此归结为 IIS 应用程序池配置中的一两个设置。

我最初认为Startup Time Limit 是最有可能的罪魁祸首,并尝试将其设置为 240 秒(因为我们的应用程序通常需要 2-3 分钟才能启动),但问题仍然存在。我随后也将Ping Maximum Response Time 更改为 240 秒,这似乎治愈了它。

当启动陷入循环时,通常(并非总是)连续启动之间有 2 分钟的间隔,所以我假设 IIS 等待 30 秒(默认 Ping Period),然后触发请求并等待 90响应的秒数,然后重新启动工作进程。

此 Powershell 代码在 Web 角色启动时运行的脚本中配置相关设置:

Import-Module WebAdministration

Get-ChildItem IIS:\AppPools | ForEach-Object {
    $appPool = "IIS:\AppPools\" + $_.Name
    $startupLimit = New-TimeSpan -Minutes 4
    Set-ItemProperty $appPool -Name processModel.startupTimeLimit -Value $startupLimit
    Set-ItemProperty $appPool -Name processModel.pingResponseTime -Value $startupLimit
}

应该可以用Microsoft.Web.Administration.ServerManager做同样的事情,但我没试过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多