![](/img/trans.png)
[英]Exception handling middleware doesn't handle exceptions - Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware is called (ASP.NET Core WebAPI)
[英]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 源代碼鏈接。
我還為你寫了一個簡化的例子。 我希望這可以解決您的問題。
異常過濾器:
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
。 您需要在引發異常時定義響應。
我曾經寫過一篇關於同一主題的簡單文章。 看一看。
希望它能解決你的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.