尝试调查
ProblemDetails
并遇到了一些问题。
我的代码:
using Microsoft.AspNetCore.Builder;
using WebApplication3;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddProblemDetails();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseStatusCodePages();
app.UseExceptionHandler();
app.MapGet("/hello", () =>
{
throw new Exception("Oulah. Hello API has problems!");
});
app.MapGet("/bad", () => Results.BadRequest(new
{
message = "Very bad, you have a problem."
}));
app.Run();
如您所见,有 2 个 API 方法 -
hello
和 bad
。
我的问题:我确实得到了预期的响应正文
hello
:
但是有了
bad
,情况就不同了:
ProblemDetail
未激活。
我看不出我的代码与我看到的其他示例有什么不同。
我需要什么:
谢谢你
它不是自动“激活”的,因为您当前的设置会将异常转换为问题。
如果您添加了:
app.UseStatusCodePages()
并删除了该消息
app.MapGet("/bad", () => Results.BadRequest());
您将获得请求 400-500 的额外激活,并且没有正文被转换为 ProblemDetails。
如果你希望消息返回 ProblemDetails 你可以自己做:
app.MapGet("/bad", () => Results.Problem(statusCode: StatusCodes.Status400BadRequest, title: "Bad"));
当您将
Results.BadRequest
与匿名对象一起使用时,您只是告诉控制器返回 400
状态代码,并将 json 化的对象作为参数传递。如果您希望控制器返回 ProblemDetails
类的表示,您可以使用 Results.Problem
(即 Results.Problem("This is a problem", statusCode: 400)
)。当控制器内部抛出异常时,它会被自动捕获,并返回 ProblemDetails
和标准错误消息。否则,你必须手动处理。