全局处理 WebAPI 2 中的所有异常
Globally handle all exceptions in WebAPI 2
我在 WebApi2 工作。我将实施全局异常处理。正如我们所知,我们可以使用 IExceptionHandler 和 IExceptionLogger 对于相同的。我也实现了同样的功能并且工作正常。
但是我对更多的场景有点困惑。所以我把我所有的场景分成 3 个部分
1。 API 例外情况
此处需要处理API范围内的所有异常。当然这里救场的是IExceptionHandler和IExceptionLogger接口。我们可以实现这个并且可以从处理程序发送自定义 HttpResponseMessage
2。 Owin 管道异常
这里是 owin 中间件中的所有异常,如令牌 api 和所有 Auth 提供程序级别的错误。
我还阅读了有关中间件的自定义异常。但在这里我需要明确的最佳实践建议。
在 Global.asax 中创建自定义中间件异常或处理是否好?
3。除指定
以外的任何其他例外
以上未提及的任何其他例外情况。我不太清楚,这里是否还有其他例外情况,但我只是在考虑。如果是,我们需要如何处理?
唯一的选项是 Global.asax Application_Error 事件。但是从这个我怎么能用我的自定义模型响应 HttpResponseMessage。
请提出您的意见和处理所有这些异常的更好方法。
Objective : 客户端在完整堆栈跟踪中没有收到任何 500 错误。将处理所有异常并仅将我的自定义消息发送到客户端
问题: 如何处理 owin 管道错误以及第 1 点中未处理的任何错误?
为了处理 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
}
}
}
并且您还应该在 Application_Error 中编写异常处理,以防您在 GlobalExceptionMiddleware 中处理登录时发生异常。
In global.asax in Application_Error 您可以使用 Response.Write(JsonConvert.SerializeObject(yourObject)
来 return 您的自定义错误。
而且 selfhost
上也没有 global.asax,所以使用 GlobalExceptionMiddleware
的好处是,如果您决定使用 SelfHost
而不是 IIS,所有的例外情况已处理。
我在 WebApi2 工作。我将实施全局异常处理。正如我们所知,我们可以使用 IExceptionHandler 和 IExceptionLogger 对于相同的。我也实现了同样的功能并且工作正常。
但是我对更多的场景有点困惑。所以我把我所有的场景分成 3 个部分
1。 API 例外情况
此处需要处理API范围内的所有异常。当然这里救场的是IExceptionHandler和IExceptionLogger接口。我们可以实现这个并且可以从处理程序发送自定义 HttpResponseMessage
2。 Owin 管道异常
这里是 owin 中间件中的所有异常,如令牌 api 和所有 Auth 提供程序级别的错误。
我还阅读了有关中间件的自定义异常。但在这里我需要明确的最佳实践建议。
在 Global.asax 中创建自定义中间件异常或处理是否好?
3。除指定
以外的任何其他例外以上未提及的任何其他例外情况。我不太清楚,这里是否还有其他例外情况,但我只是在考虑。如果是,我们需要如何处理?
唯一的选项是 Global.asax Application_Error 事件。但是从这个我怎么能用我的自定义模型响应 HttpResponseMessage。
请提出您的意见和处理所有这些异常的更好方法。
Objective : 客户端在完整堆栈跟踪中没有收到任何 500 错误。将处理所有异常并仅将我的自定义消息发送到客户端
问题: 如何处理 owin 管道错误以及第 1 点中未处理的任何错误?
为了处理 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
}
}
}
并且您还应该在 Application_Error 中编写异常处理,以防您在 GlobalExceptionMiddleware 中处理登录时发生异常。
In global.asax in Application_Error 您可以使用 Response.Write(JsonConvert.SerializeObject(yourObject)
来 return 您的自定义错误。
而且 selfhost
上也没有 global.asax,所以使用 GlobalExceptionMiddleware
的好处是,如果您决定使用 SelfHost
而不是 IIS,所有的例外情况已处理。