我可以为 Kestrel 编写自定义异常处理程序吗?

问题描述 投票:0回答:1

我有一个 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 序列化响应对象。我觉得必须有一种正确的方法来捕获不违背系统架构的错误。

.net-core error-handling kestrel-http-server
1个回答
0
投票

通常,您会使用

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();
© www.soinside.com 2019 - 2024. All rights reserved.