.NET8 Blazor Web API中Fast Endpoints的DontCatchExceptions() POST方法失效
FastEndpoints中POST接口DontCatchExceptions()导致ThrowError失效的解决方法
问题根源
当你在端点配置中调用DontCatchExceptions()时,FastEndpoints会绕过自身内置的异常处理管道,而ThrowError()方法的工作机制正是依赖这个管道来生成并返回标准化的错误响应。GET接口看似正常是因为请求流程的差异(比如无请求体绑定环节),偶然触发了默认的异常处理逻辑;但POST接口在跳过内置异常处理后,ThrowError()抛出的异常无法被正确捕获处理,最终导致请求被静默终止,没有返回任何错误响应。
解决方法
有两种可行的修复方案,根据你的需求选择:
方案1:移除DontCatchExceptions()配置
如果不需要跳过FastEndpoints的异常处理,直接移除该配置即可,ThrowError()会恢复正常工作:
Post("policies/contacts"); Options(x => x.WithTags("Policy")); // 移除DontCatchExceptions()调用
方案2:手动构造并发送错误响应(需保留DontCatchExceptions()时)
如果必须保留DontCatchExceptions(),可以在catch块中手动构造响应内容并发送,替代ThrowError():
public override async Task HandleAsync(CancellationToken ct) { try { var list = await Data.GetCountryCodeList(); await SendAsync(list); } catch (Exception e) { // 手动发送错误响应 await SendAsync( response: new { ErrorMessage = e.Message }, statusCode: 400, cancellation: ct ); } }
额外说明
POST与GET接口的差异源于请求处理流程的不同:GET请求通常无需解析请求体,FastEndpoints在处理这类请求时,未捕获的异常可能会被ASP.NET Core的默认中间件处理;而POST请求涉及请求体解析等额外步骤,当DontCatchExceptions()跳过内置处理后,ThrowError()抛出的异常无法被正确传递到响应环节,最终导致无响应返回。
内容的提问来源于stack exchange,提问作者FirstByte
相关产品推荐
相关产品推荐

