我无法让 ProblemDetails 模式每次都起作用

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

尝试调查

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
:

enter image description here

但是有了

bad
,情况就不同了:

enter image description here

ProblemDetail
未激活。

我看不出我的代码与我看到的其他示例有什么不同。

我需要什么:

  1. 了解正在发生的事情
  2. 我能做什么

谢谢你

c# asp.net-core
2个回答
0
投票

它不是自动“激活”的,因为您当前的设置会将异常转换为问题。

如果您添加了:

app.UseStatusCodePages()

并删除了该消息

app.MapGet("/bad", () => Results.BadRequest());

您将获得请求 400-500 的额外激活,并且没有正文被转换为 ProblemDetails。

如果你希望消息返回 ProblemDetails 你可以自己做:

app.MapGet("/bad", () => Results.Problem(statusCode: StatusCodes.Status400BadRequest, title: "Bad"));

0
投票

当您将

Results.BadRequest
与匿名对象一起使用时,您只是告诉控制器返回
400
状态代码,并将 json 化的对象作为参数传递。如果您希望控制器返回
ProblemDetails
类的表示,您可以使用
Results.Problem
(即
Results.Problem("This is a problem", statusCode: 400)
)。当控制器内部抛出异常时,它会被自动捕获,并返回
ProblemDetails
和标准错误消息。否则,你必须手动处理。

© www.soinside.com 2019 - 2024. All rights reserved.