【发布时间】:2019-11-12 15:02:08
【问题描述】:
我正在尝试在我的 ASP.Net Core 3.0 Web API 项目中使用中间件进行异常处理:
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context)
{
try
{
await next(context);
}
catch (Exception ex)
{
await HandleException(context, ex);
}
}
private static Task HandleException(HttpContext context, Exception ex)
{
HttpStatusCode code = HttpStatusCode.InternalServerError; // 500 if unexpected
// Specify different custom exceptions here
if (ex is CustomException) code = HttpStatusCode.BadRequest;
string result = JsonConvert.SerializeObject(new { error = ex.Message });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
}
}
startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add controllers with a route prefix
services.AddControllers(x => { x.UseGeneralRoutePrefix($"api/v{Configuration["APIVersion"]}"); });
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v0.1", new OpenApiInfo { Title = "My API", Version = "v0.1" });
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v0.1/swagger.json", "My API V1");
});
app.UseMiddleware(typeof(ErrorHandlingMiddleware));
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
控制器
[HttpPost]
public ActionResult Method()
{
if (condition)
throw new CustomException();
else
return Ok();
}
但是在控制器中抛出的异常并没有被中间件处理。使用中间件的正确方法是什么?
【问题讨论】:
-
那么会发生什么?你看到了什么?
-
@KirkLarkin 如果条件不满足,则抛出异常,应用程序刚刚崩溃。来自中间件的
HandleException()方法永远不会被调用。 -
你看到
UseDeveloperExceptionPage的结果了吗?显示错误、堆栈跟踪等的漂亮 HTML 响应? -
错误处理中间件应尽早在管道中注册。
标签: c# asp.net-core asp.net-core-webapi asp.net-core-middleware