在我的C# Web API中,我试图添加一个全局异常处理程序。我一直在使用自定义的全局
ExceptionFilterAttribute
来处理异常并返回一个HttpResponseMessage
:public override void OnException(HttpActionExecutedContext context)
{
...
const string message = "An unhandled exception was raised by the Web API.";
var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent(message),
ReasonPhrase = message
};
context.Response = httpResponseMessage;
}
这在处理控制器级别的异常时效果很好。
然而,在开发过程中,由于数据库连接问题,我们从OWIN启动文件中抛出了一个错误,但是返回了标准的IIS异常,而不是通过全局异常处理程序,并且完整的HTML被返回给API消费者。
我尝试了几种不同的方法来捕获在我的OWIN启动中抛出的异常:
自定义ApiControllerActionInvoker
:
public class CustomActionInvoker : ApiControllerActionInvoker
{
public override Task<HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
var result = base.InvokeActionAsync(actionContext, cancellationToken);
if (result.Exception != null && result.Exception.GetBaseException() != null)
{
...
}
return result;
}
}
自定义 ExceptionHandler
:
public class CustomExceptionHandler : ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
...
base.Handle(context);
}
public override bool ShouldHandle(ExceptionHandlerContext context)
{
return true;
}
}
自定义OwinMiddleware
组件:
public class CustomExceptionMiddleware : OwinMiddleware
{
public CustomExceptionMiddleware(OwinMiddleware next) : base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
try
{
await Next.Invoke(context);
}
catch (Exception ex)
{
...
}
}
}
最后只需使用 Application_Error
:
protected void Application_Error(object sender, EventArgs e)
{
...
}
但是似乎没有任何方法能够捕获这个异常。
有人知道如何捕获该异常并返回 HttpResponseMessage
吗?或者是否我已经尝试的任何方法都应该有效?
非常感谢任何帮助。
AppDomain
的UnhandledException
事件。当出现异常且没有适当的处理程序来处理异常时,该事件必须触发。 - Amit Kumar GhoshApplication_Start
方法添加订阅UnhandledException
,但似乎没有捕获到异常。在Web API中,UnhandledException
是否一定有效? - Dan Ellis