.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リクエストを処理する方法であり、ここで異常をキャプチャして処理することができます.
  • 次に、このミドルウェアをhttpパイプに登録すればいいです.

  • Startupを次のように変更します.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseMiddleware();
    
        //other middleware
    }
    

    注意順序は、他の処理ロジックのミドルウェアの前にしてください.そうしないと、例外をキャプチャできません.