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

时间:2019-05-06 09:10:07

标签: c# asp.net-core

在.net core 2.2中,具有状态代码为415的默认json

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

我不知道此JSON的来源。 我按照下面的https://codepen.io/ritaD86/pen/MyOdQr重写json

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

  

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

     

Content-Type:应用程序/问题+ json; charset = 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"
}

过滤器

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

2 个答案:

答案 0 :(得分:1)

  

我不知道此JSON的来源。

{"keywords": [["keyword1"], ["keyword2"], ["keyword3"]]} 属性应用于控制器时,它将启用Problem details for error status codes,最后将内置动作过滤器添加到该控制器的MVC过滤器管道中。此操作过滤器适用于所有状态代码> = 400,并产生您描述的JSON响应。

  

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

当您的[ApiController]代码运行时,上面提到的动作过滤器已经将JSON写入主体。您向主体编写了一个附加的JSON格式的字符串,该字符串将被追加并处理响应,使其成为无效的JSON。

如果要禁止将此问题详细信息JSON写入响应中,可以将以下内容添加到MediaTypeResouceFilter.OnResourceExecuted代码中以禁止该功能:

Startup.ConfigureServices

答案 1 :(得分:0)

似乎您只是追加到主体,执行过滤器之前写入主体的内容仍然保留在主体中。

如果您take a look at the documentation了解如何实现IResource过滤器,则可以使用以下代码行实现目标,但可以在OnResourceExecuting内部进行:

context.Result = new ContentResult()
{
    Content = jsonString
};

文档指出:

  

通过在提供给过滤方法的上下文参数上设置Result属性,可以随时使过滤管线短路。

如果将代码放在OnResourceExecuting中。