我有一个在IIS上运行的.NET Core Web服务。作为启动的一部分,该服务将连接到RabbitMQ。但是,如果由于某种原因连接失败,则该服务将在启动过程中崩溃。
这种情况会发生很多次,直到IIS快速失败保护策略生效并关闭应用程序池。然后,需要手动重新启动才能使其再次运行。
是否可以在Main()方法中处理异常,并且在不启动应用的同时,防止IIS将其视为故障,从而避免快速故障保护?理想情况下,服务将在下一个传入请求时再次启动。
更新:
我自己弄明白了。基本上你可以停止应用程序,它会在下一个传入的请求时再次启动:
public static async Task Main(string[] args)
{
var webHost = CreateHostBuilder(args).Build();
try
{
webHost.Run();
}
catch (StartMessageBusException)
{
// If we cannot connect to RabbitMQ on startup then we want to
// gracefully shut down the app. This way IIS will try to start the app again on the next request
await webHost.StopAsync();
}
}
2条答案
按热度按时间c3frrgcw1#
这里的答案很好地描述了如何在asp.net核心webapi应用程序中设置RabbitMQ-Setup RabbitMQ consumer in ASP.NET Core application
我建议您在单例中进行异常处理和重试。
wko9yo5t2#
我们遇到了同样的问题。我们必须采取两个步骤:
1.通过调用
await webHost.StopAsync();
关闭所有后台作业。只是为了确保所有后台作业(包括侦听HTTP请求的WebHost)都正确结束。1.通过调用
Environment.Exit(-1);
通知IIS应用程序执行已结束。如果您不发送退出代码,IIS 10将不会再次启动该进程。完整示例: