C# 如何覆盖ASP.Net Core2.2中的415响应
在.NETCore2.2中,有一个默认的json,状态码为415C# 如何覆盖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
{
"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;
};