我的 ASP.net MVC 项目中有一些代码可以异步发送消息。在某些情况下,该代码可能会失败并导致未处理的异常。我无法直接访问引发异常的代码或生成线程的代码,因此我无法在那里捕获和处理错误。我尝试在 Global.asax 中的 Application_Error 级别进行捕获,但该函数仅针对页面错误而不是后台错误引发。我还尝试通过实现 OnUnhandledException 来捕获 HTTP 模块,但我找不到捕获异常并阻止工作进程存在于其中的方法。
有没有办法防止这些错误变得如此致命?我知道它们是严重的错误,应该得到处理,但我希望它们不要为其他页面上的其他用户终止工作进程。
更多细节:
消息调度程序是 EventStore,我相信我在这种情况下遇到的问题是它试图反序列化从以前版本的 NServiceBus 实现 ICommand 的消息。更新到最新的测试版后,反序列化似乎失败了。不幸的是,我愚蠢地删除了导致错误的提交,因此我无法完全复制该问题。
到目前为止,我发现模拟错误的最佳方法是
public virtual ActionResult Error()
{
Task.Factory.StartNew(blowup);
return new EmptyResult();
}
private void blowup()
{
throw new Exception("snap");
}
您会注意到 snap 异常被抛出并被正确处理而不会引起问题。但是,如果您等待,那么我们没有观察到 Task 的异常属性的事实最终会杀死整个应用程序。
针对 Cassini 进行了测试,但在 IIS 7.5 上看到了类似的行为。