2

我最近向生产网站发布了一个 asp.net web api。在大约每天一次的生产中,未处理的异常会导致网站进程循环:

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

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

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

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

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

4

1 回答 1

4

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

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

最后,请参阅我关于此主题的问题:如何在 ASP.NET 中处理未处理的线程异常?我没有得到可用的答案,但它仍然可能对您有所帮助。

于 2012-08-29T11:50:44.717 回答