如何优雅地关闭 ASP.Net(非核心)

Posted

技术标签:

【中文标题】如何优雅地关闭 ASP.Net(非核心)【英文标题】:How to Gracefully Shut Down ASP.Net (not Core) 【发布时间】:2021-03-31 14:54:45 【问题描述】:

我有一个托管在 IIS 中的 WCF 服务应用程序。启动时,它从 web.config 读取 SQL 连接信息并连接到 SQL Server 以获取引导应用程序所需的信息。如果 SQL Server 由于某种原因不可用,我们希望服务关闭 - 我目前通过抛出异常来实现。

我们遇到的问题是,如果服务无法启动超过 N 次,IIS 会帮助关闭应用程序池 - 这意味着,在 SQL Server 连接问题得到纠正后(可能完全在 IIS 外部)服务器),系统管理员必须考虑重新打开应用程序池。

我想做的是让服务优雅地退出。我知道使用 ASP.Net Core 有办法做到这一点(即,连接到进程的生命周期管理并告诉它退出的方法),但一直无法为 .Net Framework/ASP 找到类似的东西。网。

有没有这样的 API 可以使用?

【问题讨论】:

您想关闭服务...但不想停止应用程序池?我对你在这里想要完成的事情感到困惑。 当前,来电,IIS启动服务,连接数据库失败,启动失败。如果检测到这一点的速度足够快,并且根本问题(如 SQL Server 关闭)得到了修复,那么下一次调用进来并且 IIS 启动服务时,它将正常启动。但是,如果它连续失败 N 次以上,IIS 将禁用应用程序池 - 因此即使 SQL Server 连接问题得到修复,该服务也不会启动,直到有人手动重新启动应用程序池。所以,我需要一种方法来让服务在不出错的情况下无法启动。 在这种情况下,服务 = 应用程序池。因此,如果您不希望它停止尝试启动,那么您需要disable IIS rapid fail protection。 一个应用程序池可以托管多个服务,因此不存在一对一的等效性。您似乎在暗示它无法启动应用程序池,而不是应用程序? 然后停止让您的应用程序无法启动。将其包装在重试策略中,以便它不断重试。或者使它成为一个异步进程,并且任何依赖于该进程的代码在使用它之前等待该进程完成。如果您不想禁用快速故障保护(这是让您的应用在多次失败后无法启动的原因),那么您需要让您的应用不会启动失败。你不能同时拥有它。 【参考方案1】:

事实证明这个方法是可用的并且有效。

https://docs.microsoft.com/en-us/dotnet/api/system.web.hosting.hostingenvironment.initiateshutdown?view=netframework-4.8

【讨论】:

以上是关于如何优雅地关闭 ASP.Net(非核心)的主要内容,如果未能解决你的问题,请参考以下文章

azure 应用服务和 asp.net 核心:CORS 策略甚至 AllowAnyOrigin 也阻止了来源

如何关闭由 ASP.NET 核心框架完成的日志记录

优雅地停止ASP.NET Core Web App(从Visual Studio调试器中),这是一个与IHostedService相关的问题

Application_End 和后台进程,优雅地退出 ASP.Net 应用程序

ASP.NET Core 6框架揭秘实例演示[05]:依赖注入基本编程模式

如何正确地将 asp.net 核心模型状态错误反序列化为 xamarin 形式的对象