gpt4 book ai didi

asp.net-mvc - Azure Web 角色启动时 Application_Start 循环

转载 作者:行者123 更新时间:2023-12-02 01:19:21 25 4
gpt4 key购买 nike

我们有一个在 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 正在进行时收到新请求时,它似乎正在重新启动应用程序而不是让原始请求完成。

最佳答案

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

IIS app pool ping settings

我最初认为启动时间限制是最有可能的罪魁祸首,并尝试将其设置为 240 秒(因为我们的应用程序通常需要 2-3 分钟才能启动),但问题仍然存在。随后我还将 Ping 最大响应时间 更改为 240 秒,这似乎已经解决了这个问题。

当启动陷入循环时,连续启动之间通常(并非总是)有 2 分钟的间隔,因此我假设 IIS 等待 30 秒(默认 Ping 周期),然后在重新启动工作进程之前,触发请求并等待 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 执行相同的操作,但我没有尝试过。

关于asp.net-mvc - Azure Web 角色启动时 Application_Start 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41017091/

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