如何在 ASP.Net Core2.2 中覆盖 415 响应

Z.C*_*hen 5 c# asp.net-core

在 .net core 2.2 中,有一个默认的 json,状态码为 415,如

{
   "type":"https://tools.ietf.org/html/rfc7231#section-6.5.13",
   "title":"Unsupported Media Type",
   "status":415,
   "traceId":"8000003e-0001-f500-b63f-84710c7967bb"
}
Run Code Online (Sandbox Code Playgroud)

我不知道这个 JSON 是怎么来的。我按照下面的例子重写json

但是我得到了不同的结果,它在原始 json 中添加了一个部分。这是我的 Wireshark 结果

HTTP/1.1 415 不支持的媒体类型传输编码:分块

内容类型:应用程序/问题+json;字符集=utf-8 服务器:

Microsoft-IIS/10.0 X-Powered-By:ASP.NET 日期:2019 年 5 月 6 日星期一 09:03:56 GMT

{
   "type":"https://tools.ietf.org/html/rfc7231#section-6.5.13",
   "title":"Unsupported Media Type",
   "status":415,
   "traceId":"8000002c-0002-fb00-b63f-84710c7967bb"
}
{
   "data":"this is custom message"
}
Run Code Online (Sandbox Code Playgroud)

过滤器

public class MediaTypeResouceFilter : Attribute, IResourceFilter
{
    public void OnResourceExecuting(ResourceExecutingContext context)
    {
    }

    public void OnResourceExecuted(ResourceExecutedContext context)
    {
        if (context.HttpContext.Response.StatusCode == 415)
        {
            var jsonString = JsonConvert.SerializeObject(new { data = "this is custom message" });
            byte[] data = Encoding.UTF8.GetBytes(jsonString);
            context.HttpContext.Response.Body.WriteAsync(data, 0, data.Length);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*kin 5

我不知道这个JSON是怎么来的。

当该[ApiController]属性应用于控制器时,它会启用错误状态代码的问题详细信息,最终将内置操作过滤器添加到该控制器的 MVC 过滤器管道中。此操作过滤器适用于所有状态代码 >= 400 并生成您所描述的 JSON 响应。

它在原始 json 中添加了一个部分

当您的MediaTypeResouceFilter.OnResourceExecuted代码运行时,我上面提到的操作过滤器已经将 JSON 写入正文。您向正文写入一个附加的 JSON 格式的字符串,该字符串只是被附加并将响应破坏为无效的 JSON。

如果您想禁止为响应写入此问题详细信息 JSON,您可以将以下内容添加到Startup.ConfigureServices代码中以抑制该功能:

services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressMapClientErrors = true;
    };
Run Code Online (Sandbox Code Playgroud)