c# - .NET 核心 Web API : return a custom HTTP status code with Content Type application/problem+json

标签 c# asp.net-core asp.net-core-webapi

ControllerBase 包含返回 ConflictResult 对象(表示 HTTP 409 响应)的 Conflict() 等方法,该对象派生自 状态代码结果。生成的响应正文具有内容类型 application/problem+json 并且如下所示:

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.8",
    "title": "Conflict",
    "status": 409,
    "traceId": "0HLO99QHFC9QI:00000001"
}

HTTP 410 响应没有内置方法/类,所以我做了一个:

[DefaultStatusCode(410)]
public class GoneResult : StatusCodeResult
{
    public GoneResult() : base(410)
    {}
}
...
public static class ControllerBaseExtensions
{
    public static GoneResult Gone(this ControllerBase controllerBase) // this doesn't give all the problem+JSON attributes
    {
        return new GoneResult();
    }
}

然而,这给出了

{
    "type": "about:blank",
    "status": 410
}

type 值不同,titletraceId 字段缺失。

我还想为 HTTP 500 响应创建一个自定义类,其中包含带有错误消息的 message 字段。我试过返回 StatusCode(StatusCodes.Status500InternalServerError),它给我的最小 application/problem+json 响应与我的 Gone() 相同方法;我也试过返回 StatusCode(StatusCodes.Status500InternalServerError, message),这给了我错误消息,但将响应格式化为 text/plain

最佳答案

生成 ProblemDetails 响应的代码不知道 410 状态代码,因此它没有关联的 LinkTitle 属性以在构建响应对象时使用。要添加此意识,请配置 ApiBehaviorOptionsConfigureServices 中,像这样:

services.Configure<ApiBehaviorOptions>(options =>
{
    options.ClientErrorMapping[410] = new ClientErrorData
    {
        Title = "Gone",
        Link = "https://tools.ietf.org/html/rfc7231#section-6.5.9"
    };
});

ClientErrorMappingint (状态代码)到 ClientErrorData 的字典.请注意,我在上面用于 Link 的值确实指向 RFC 的正确部分。

关于c# - .NET 核心 Web API : return a custom HTTP status code with Content Type application/problem+json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57045212/

相关文章:

c# - 调用 Actionfilter 时未呈现 _Layout 上的部分 View

c# - 记录 ASP.NET Core 中的配置更改

c# - ASP.Net Core MVC - 自定义属性的客户端验证

sql-server - Docker SQL Server异常

c# - 闭包捕获的变量也会修改原始变量

c# - 进程中的 pg_dump 未写入任何文件

c# - 需要使用 Entity Framework 加快将大对象图写入数据库的速度

c# - 使用 JWT 声明对 .NET Core Web API Controller 进行单元测试

c# - 只删除 c# 上的一些 html 标签

c# - 为什么进程会丢失线程?