.Net Core Web Apiでのグローバル例外の処理方法
シーンの操作
Web Apiを要求すると、処理されていない例外に遭遇することは避けられません.この場合、サーバは通常500エラーを返します.より良いユーザー体験のために、グローバルな未処理例外をキャプチャし、呼び出し側に友好的なエラー情報を返す必要があります.
ソリューション
からNet Coreは、マイクロソフトがミドルウェアの概念を導入し、ミドルウェアを通じてhttpリクエストをすべてブロックしたり、未処理の例外をすべてキャプチャしたりすることができます.
public class ExceptionHandlingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
private readonly IHostEnvironment _host;
public ExceptionHandlingMiddleware(
RequestDelegate next,
ILoggerFactory loggerFactory,
IHostEnvironment host)
{
_next = next;
_logger = loggerFactory.CreateLogger();
_host = host;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
await HandleException(context, ex);
}
}
private Task HandleException(HttpContext context, Exception exception)
{
_logger.LogError(exception, exception.Message);
//
var body = JsonSerializer.Serialize(new
{
message = exception.Message,
stackTrace = _host.IsDevelopment() ? exception.StackTrace : string.Empty
});
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)HttpStatusCode.OK;
return context.Response.WriteAsync(body);
}
}
ミドルウェアは普通のクラスですが、httpリクエストを処理する方法であり、ここで異常をキャプチャして処理することができます.
Startupを次のように変更します.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware();
//other middleware
}
注意順序は、他の処理ロジックのミドルウェアの前にしてください.そうしないと、例外をキャプチャできません.