【发布时间】:2015-09-11 07:03:20
【问题描述】:
我有一个 ASP.NET,它依赖于一些使用静态构造函数的代码。这些类型初始化器中的代码有时会失败。假设,为了争论,代码是:
public static readonly string Thing = SomeSpecialCallThatRarelyFails();
也许这很卑鄙,但无法改变。而且这种代码存在于每个控制器中,因此 ASP.NET 无法创建控制器,只能坐在那里损坏,直到有人来重新启动它。
我知道这是应该的方式,因为问题很可能是非暂时性的,并且自动重启会创建一个循环。或者也许只有一个控制器出现故障,所以该应用程序仍然存在。所以我得到默认行为只是继续返回错误。但在这种特殊情况下,让我们假设最好的办法是注意到此故障并重新启动。
如何自动检测这种情况并触发 IIS 应用程序池/AppDomain 的重新启动或回收?
我注意到,如果我在 Application_Start 上引发异常,则应用程序将自动重新启动。因此,一种方法是让我遍历所有类型并尝试访问它们。如果他们有 .cctor 失败,那么我将崩溃 Application_Start 并且 ASP.NET 将重新启动。但这很 hacky,而且如果实际的请求代码引用了另一种我不知道会在 .cctor 上引发的类型,它也无济于事。
有没有更好的方法?我应该编写一个 Web API 过滤器并查找 TypeInitializerException 吗?
【问题讨论】:
标签: c# asp.net iis asp.net-web-api exception-handling