C# 如何覆盖ASP.Net Core2.2中的415响应

C# 如何覆盖ASP.Net Core2.2中的415响应,c#,asp.net-core,C#,Asp.net Core,在.NETCore2.2中,有一个默认的json,状态码为415 { "type":"https://tools.ietf.org/html/rfc7231#section-6.5.13", "title":"Unsupported Media Type", "status":415, "traceId":"8000003e-0001-f500

在.NETCore2.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"
}
我不知道这个JSON是怎么来的。 我按照下面的步骤重写json

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

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

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

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

过滤器

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);
        }
    }
}

看起来您只是在向正文追加内容,在执行筛选器之前写入正文的内容都保留在正文中

如果您想了解如何实现IResource筛选器,您可以通过这行代码实现您的目标,但在OnResourceExecuting内部:

context.Result = new ContentResult()
{
    Content = jsonString
};
文件指出:

通过在提供给筛选器方法的上下文参数上设置Result属性,可以在任意点短路筛选器管道

如果你把代码放在OnResourceExecuting中

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

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

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

当您的
MediaTypeResourceFilter.OnResourceExecuted
代码运行时,我上面提到的操作过滤器已经将JSON写入主体。在主体中写入一个附加的JSON格式的字符串,该字符串将被追加,并将响应更改为无效JSON

如果要禁止为响应编写此问题详细信息JSON,可以在
启动中添加以下内容。ConfigureServices
代码以抑制此功能:

services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressMapClientErrors = true;
    };

实际上,它所做的是使响应不是JSON。JSON不支持对象像那样彼此跟随。我不是ASP.NET核心专家,但也许你已经启用了现有的和新的过滤器,它们都添加了输出?@LasseVågsætherKarlsen它实际上不是JSON,但在wireshark result中它的内容类型是application/problem+jsonI我仍然猜测现有的和你的过滤器都添加了各自的输出,按照旧+新的顺序。现在,一个更好的问题是问你真正想发生什么?是否要将属性添加到现有响应中?您是否想删除旧的响应,只响应<代码> {“数据”:“这是自定义消息”} /代码>我问,因为您的问题似乎暗示您当前的响应是错误的,但您没有陈述您认为正确的内容。这使得任何人都很难提出建议。@LasseVågsætherKarlsen我想删除旧的响应,只使用{“data”:“这是自定义消息”}进行回复。我确定我的WebAPI中只有一个筛选器如果在编写自己的筛选器之前无法(或太晚)清除输出,则需要禁用/重新实现现有筛选器,以确保它不会首先输出自己的消息。我尝试了此方法。但响应正文不会更改。“>以下各项具有相同的功能problem@Z.Chen你试过把它放到OnResourceExecuting中吗?文档说它需要去那里。如果我把它放在OnResourceExecuting中,我就看不出respnose状态代码了。总是200。
services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressMapClientErrors = true;
    };