Asp.Net Core API构建Host崩溃的IIS环境自动恢复方案咨询
问题:IIS托管的ASP.NET Core API启动失败后进程僵死无法自动重启
环境与代码
我有一个基于.NET 6的ASP.NET Core API,其Program.cs代码如下:
public class Program { public static void Main(string[] args) { var host = BuildWebHost(args).Build(); host.Run(); } public static IHostBuilder BuildWebHost(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseKestrel(options => { options.Limits.MinRequestBodyDataRate = new MinDataRate(100, TimeSpan.FromSeconds(30)); }) .UseIISIntegration() .UseStartup<Startup>(); }); }
在Startup类中,启动代码需要访问数据库以获取各类启动配置。该API通过AspNetCoreModuleV2托管在IIS中。
问题现象
当数据库不可用时:
- 直接运行API可执行文件,进程会正常停止
- 但在IIS中,API启动崩溃后,IIS会返回500错误(符合预期),但API进程并未终止,而是保持存活状态,成为"僵死"进程
- 此时刷新网站会立即返回500错误,必须手动重启API才能恢复服务
需求
我需要可行的解决方案,比如通过web.config配置或在.NET代码中发送信号告知"IIS进程已僵死,请重启",避免手动操作。理想状态是:IIS在返回500错误2-5分钟后,自动尝试重新启动可执行文件,直到数据库恢复正常。
优先寻找由IIS原生处理的方案,无需搭建额外架构。
补充:批量排查脚本
受启发编写了一个PowerShell脚本,可查找所有运行中的目标可执行文件进程,通过进程用户名获取站点域名,逐个检测站点状态(当前用于手动批量排查,后续可扩展为根据状态重启应用池):
$apiProcesses = Get-Process NAME_OF_YOUR_EXECUTABLE -IncludeUserName foreach($process in $apiProcesses) { $siteDomain = $process.userName -replace "IIS APPPOOL\\", "" Write-Host ("Checking $siteDomain") $testUri = "https://$siteDomain/api/license" $Request = [system.Net.WebRequest]::Create($testUri) try { # Get the response $Response = $Request.GetResponse() } catch [System.Net.WebException] { # If it fails, get Response from the Exception $Response = $_.Exception.InnerException.Response } if(200 -ne ($Response.StatusCode -as [int])){ Write-Host " Site $testUri seems down" } }
内容的提问来源于stack exchange,提问作者ankhansen
相关产品推荐
相关产品推荐

