web api TaskScheduler.UnobservedTaskException

时间:2012-08-29 00:08:09

标签: asp.net .net asp.net-web-api task-parallel-library

我最近在生产网站上发布了一个asp.net web api。在大约每天生产一次时,未处理的异常导致网站流程回收:

  

发生了未处理的异常,并且该过程已终止。   应用程序ID:/ LM / W3SVC / 2 / ROOT / oasis进程ID:9236例外:   System.AggregateException消息:任务的异常不是   通过等待任务或访问其异常来观察   属性。结果,未被观察到的异常被重新抛出了   终结者线程。 StackTrace:at   System.Threading.Tasks.TaskExceptionHolder.Finalize()InnerException:   System.Web.HttpException消息:远程主机关闭了   连接。错误代码是0x800704CD。 StackTrace:at   System.Web.Http.WebHost.HttpControllerHandler.EndProcessRequest(IAsyncResult的   结果)在   System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,   布尔和放大器; completedSynchronously)

此异常似乎不是源于程序代码,而是来自web api内部。我需要防止这样的例外,因为这会破坏大量用户的会话。

我理解处理此异常的一种方法是使用:

TaskScheduler.UnobservedTaskException += (sender, e) =>
{
    McpsEventLog.PostException(e.Exception, "webapicontroller");
    e.SetObserved();
};

但为了这个工作,我可以在哪里放这个代码。在网络api控制器的某个地方?或者在global.asax中。有人知道如何在asp.net Web Api休息服务中实现UnobserveredTaskException吗?

1 个答案:

答案 0 :(得分:3)

您说得对:在Web应用程序的上下文中,未处理的异常是不可接受的。设置该处理程序的正确位置是Application_Start事件。

您还应该设置UnhandledException-event。但是,它不允许您吞下异常。只记录它。

最后,请参阅我关于此主题的问题:How to treat unhandled thread-exceptions in ASP.NET?我没有得到有用的答案,但它可能仍然对您有帮助。