我最近在生产网站上发布了一个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吗?
答案 0 :(得分:3)
您说得对:在Web应用程序的上下文中,未处理的异常是不可接受的。设置该处理程序的正确位置是Application_Start
事件。
您还应该设置UnhandledException-event。但是,它不允许您吞下异常。只记录它。
最后,请参阅我关于此主题的问题:How to treat unhandled thread-exceptions in ASP.NET?我没有得到有用的答案,但它可能仍然对您有帮助。