我在WebApi2工作。我将实现全局异常处理。正如我们所知,我们可以使用 IExceptionHandler 和 IExceptionLogger 。我也实现了相同和工作正常。
但是我对一些更多场景感到困惑。所以我将所有场景分成3部分
这里需要处理API范围内的所有异常。当然,这里的救援是 IExceptionHandler 和 IExceptionLogger 接口。我们可以实现这个,并可以从处理程序
发送自定义HttpResponseMessage此处owin中间件中的所有异常,例如token api和所有Auth提供程序级错误。
我也读过关于中间件的自定义异常。但在这里,我需要明确的最佳实践建议。
在Global.asax中创建自定义中间件例外或处理是否合适?
此处未提及任何其他例外情况。我不确切地知道,这里有任何其他例外,但我只是想着这个。如果是,我们需要处理什么?
只有选项是Global.asax Application_Error事件。但是从这个方面我怎么能用我的自定义模型作为HttpResponseMessage响应。
请提供您的意见和更好的方法来处理所有这些例外情况。
目标: 客户端在完整堆栈跟踪时没有出现任何500错误。将处理所有异常并仅将我的自定义消息发送到客户端
问题: 如何处理owin管道错误以及第1点未处理的任何错误?
答案 0 :(得分:0)
对于处理Owin管道异常,您可以编写自己的ExceptionHandler中间件并将其添加到您的owin管道的开头。你的中间件可以是这样的
public class GlobalExceptionMiddleware : OwinMiddleware
{
public GlobalExceptionMiddleware(OwinMiddleware next) : base(next)
{}
public override async Task Invoke(IOwinContext context)
{
try
{
await Next.Invoke(context);
}
catch(Exception ex)
{
// your handling logic
}
}
}
如果您在GlobalExceptionMiddleware中处理登录时发生异常,也应该在Application_Error中编写异常处理。
在Application_Error的global.asax中,您可以使用Response.Write(JsonConvert.SerializeObject(yourObject)
返回自定义错误。
而selfhost
上也没有global.asax,所以拥有GlobalExceptionMiddleware
的好处是,如果您决定使用SelfHost
而不是IIS,那么所有例外处理完毕。