我有一个 ASP.NET Core Web 服务,精简到了必需的部分:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
var app = WebApplication.Create();
app.Urls.Add("http://localhost:3001");
app.MapGet("/error", ThrowAnError);
string ThrowAnError()
{
throw new SomeCustomException();
}
app.Run();
当我运行此命令并浏览到
/error
端点时,我收到 500 响应。我希望发生的是让某些东西捕获这个特定的异常,并让我的代码提供替代响应。有没有办法传入自定义错误处理程序?
(错误类似于 409-Conflict。我发现,如果我在这个异常事件中从代码深处抛出异常,而不是在每一层设计一个包含成功或拒绝响应的元组返回,事情就会变得简单得多.)
侧栏:目前,我正在将一个包装器传递到 MapGet 中,该包装器实现 try/catch 并返回我的自定义响应。 (有关要点,请参阅我最近的另一个问题。)这种方法的问题是,我最终绕过了许多使 Kestrel 如此有用的东西,包括 JSON 序列化响应对象。我觉得必须有一种正确的方法来捕获不违背系统架构的错误。
通常,您会使用
app.Use
作为中间件来处理此类情况
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", _ => throw new Exception("test"));
app.Use(async (context, next) =>
{
try
{
await next(context);
}
catch
{
context.Response.StatusCode = 409;
}
});
app.Run();