c# - 在类型初始值设定项/静态构造函数异常时重新启动 IIS AppDomain

标签 c# asp.net iis asp.net-web-api exception

我有一个 ASP.NET 依赖于一些使用静态构造函数的代码。这些类型初始值设定项中的代码有时会失败。为了便于讨论,假设代码是:

public static readonly string Thing = SomeSpecialCallThatRarelyFails();

也许这很卑鄙,但这是无法改变的。这种代码存在于每个 Controller 中,因此 ASP.NET 无法创建 Controller ,只能停在那里,直到有人过来重新启动它。

我知道这是应该的方式,因为问题很可能是非暂时性的,自动重启会造成循环。或者也许只有一个 Controller 出现故障,所以该应用程序仍然存在。所以我得到默认行为只是继续返回错误。但在这种特殊情况下,让我们假装最好的办法是注意到此故障并重新启动。

如何自动检测这种情况并触发 IIS 应用程序池/AppDomain 的重启或回收?

我注意到,如果我在 Application_Start 上引发异常,应用程序将自动重启。因此,一种方法是遍历所有类型并尝试访问它们。如果他们有 .cctor 失败,那么我将崩溃 Application_Start 并且 ASP.NET 将重新启动。但这非常 hacky,而且如果实际请求代码引用了另一种我不知道会抛出 .cctor 的类型,它也无济于事。

有没有更好的方法?我是否应该编写 Web API 过滤器并查找 TypeInitializerException 或其他东西?

最佳答案

只是一个想法。 “罕见故障”是确定性的吗?是否可以通过增加重试逻辑来解决?

public static readonly string Thing = RetrySpecialCall();

private static string RetrySpecialCall()
{
    while (true)
    {
        try
        {
            return SomeSpecialCallThatRarelyFails();
        }
        catch (Exception) {}
    }
}

关于c# - 在类型初始值设定项/静态构造函数异常时重新启动 IIS AppDomain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31037371/

相关文章:

c# - 为什么我得到这个 NullReferenceException C#

c# - EF CORE - Fluent API - 级联删除限制在表上

c# - 禁止 NTLM 身份验证对话框

windows - 使用 CredSpec 的经典 ASP/MSSQL 身份验证问题

asp.net - 用于 Flex 4.6 前端的 ASP.NET 中没有 MVC 框架的 Web API

c# - 如何将纯文本命令发送到在具有脚本引擎的 win7 上运行的 c# 类?

c# - 什么时候没有方法的 C# 类是糟糕的设计?

c# - 执行 Asyc 时,我可以 "update"ASP UpdateProgress 吗?下载?

jquery - 将 Typeahead.js 与 ASP.Net Webmethod 集成

ASP.NET IIS错误