在.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);
}
}
}
答案 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中。