簡體   English   中英

自定義中間件不處理調試運行 ASP.NET CORE 的異常

[英]Custom Middleware doesn't handle exception with debug run ASP.NET CORE

我試圖在我的 ASP.Net Core 5.0 項目中使用中間件進行異常處理,但它不處理異常,並且在拋出異常時調試會停止應用程序。

    
public class CustomExceptionMiddleWare
    {
        private readonly RequestDelegate _next;
        public CustomExceptionMiddleWare(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            var watch = Stopwatch.StartNew();
            try
            {
                string message = "[Request] HTTP " + context.Request.Method + " - " + context.Request.Path;
                Console.WriteLine(message);
                await _next(context);
                watch.Stop();
                message = "[Request] HTTP " + context.Request.Method + " - " + context.Request.Path + " responded " +
                    context.Response.StatusCode.ToString() + " in " + watch.Elapsed.TotalMilliseconds + " ms";
                Console.WriteLine(message);
            }
            catch (Exception ex)
            {
                watch.Stop();
                await HandleException(context, ex, watch);
            }
        }

        private Task HandleException(HttpContext context, Exception ex, Stopwatch watch)
        {
            context.Response.ContentType = "application/json";
            context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;


            string message = "[Error]   HTTP" + context.Request.Method + " - " + context.Response.StatusCode +
                " Error Message " + ex.Message + " in " + watch.Elapsed.TotalMilliseconds + " ms";
            Console.WriteLine(message);


            var result = JsonConvert.SerializeObject(new { Error = ex.Message }, Formatting.None);
            return context.Response.WriteAsync(result);
        }
    }


    public static class CustomExceptionMiddlewareExtension
    {
        public static IApplicationBuilder UseCustomExceptionMiddleWare(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<CustomExceptionMiddleWare>();
        }
    }
}

啟動.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                //app.UseDeveloperExceptionPage();
                app.UseCustomExceptionMiddleWare();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "PatikaWebApi v1"));

            }

            
            //app.UseMiddleware<CustomExceptionMiddleWare>();
            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseCustomExceptionMiddleWare();


            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

controller

 [HttpGet("{id}")]
        public IActionResult GetById(int id)
        {
            BookDetailViewModel result;
            GetBooksDetailQuery query = new GetBooksDetailQuery(_context,_mapper);
            query.BookId = id;
            GetBooksDetailQueryValidator validator = new GetBooksDetailQueryValidator();
            validator.ValidateAndThrow(query);
            result = query.Handle();
            return Ok(result);        
        }

當拋出異常時,中間件不會使用調試模式處理異常。 我搜索了解決方案,發現了一個刪除app.UseDeveloperExceptionPage(); 行對我不起作用。我試圖改變管道但也沒有工作。 解決方案是什么? 感謝您的關注。

錯誤是用戶未處理的異常

從表面上看,我看不出為什么你的調試點沒有被擊中。 但我建議在這種情況下使用過濾器而不是中間件。

您可以查看 Jason Taylor 關於如何執行此操作的文章。 這是他的 github 源代碼鏈接。

https://github.com/jasontaylordev/CleanArchitecture/blob/main/src/WebUI/Filters/ApiExceptionFilterAttribute.cs

我還為你寫了一個簡化的例子。 我希望這可以解決您的問題。

異常過濾器:

using Microsoft.AspNetCore.Mvc.Filters;

namespace Multitrust.API.Filters
{
public class ApiExceptionFilter : ExceptionFilterAttribute
{
    public ApiExceptionFilter() 
    {
    }


    public override void OnException(ExceptionContext context)
    {

        HandleException(context);
    }

    private void HandleException(ExceptionContext context)
    {
        //Do stuff with the exception
    }

    }
}

啟動.cs:

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddControllersWithViews(options =>
            options.Filters.Add(new ApiExceptionFilter()));
            
      //Bind other services...

     }

如果您需要任何幫助,請告訴我。

快樂編碼

.NET 內核中已經提供了一個中間件。 app.UseExceptionHandler 您需要在引發異常時定義響應。

我曾經寫過一篇關於同一主題的簡單文章。 看一看。

在 ASP.Net core API 中處理異常

希望它能解決你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM