如何防止ASP.net WP终止错误

时间:2012-02-23 20:49:53

标签: asp.net-mvc nservicebus cqrs event-store

我的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");
    }

您会注意到抛出异常异常并正确处理而不会导致问题。但是,如果您等待,那么我们没有观察到Task的异常属性最终将终止整个应用程序。

对Cassini进行了测试,但在IIS 7.5上看到了类似的行为。

2 个答案:

答案 0 :(得分:1)

问题是任何未处理的异常都会导致进程中止。这个问题与ASP.NET无关。

连接unobservedtaskexception事件(http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.unobservedtaskexception.aspx)以捕获所有异常(并发送给您并发送电子邮件)。

我认为将此事件与Application_Error事件以及Thread.UnhandledException事件挂钩是最佳做法。

答案 1 :(得分:1)

.NET 1.1为所有未处理的异常提供了支持。它会悄悄地抓住它们并继续它的快乐方式。

在.NET 2.0中,Microsoft将此更改为您现在看到的行为:任何完全未处理的异常都会降低该过程,但您可以通过Application_Error方法Thread的“Handler Soup”处理其中一些异步异常。 UnhandledException事件,在.NET 4.0中,TaskScheduler.UnobservedTaskException。

Microsoft提供配置值以恢复.NET 1.1行为,这在Web应用程序中非常关键,其中一个错误的异常可以回收整个过程,从而在过程中丢弃有价值的缓存项。

<runtime>部分:

<legacyUnhandledExceptionPolicy enabled="1"/>

Microsoft文章Exceptions in Managed Threads更详细地解释了所有这些内容。