提问人:RAM 提问时间:9/26/2018 更新时间:3/28/2019 访问量:2631
内容协商:如何删除JSON作为支持的格式?
Content negotiation: how to remove JSON as a supported format?
问:
我正在 ASP.NET Core 2.1 中实现一个基于专门支持 XML 的规范的 Web 服务。因此,内容协商过程必须返回 XML 文档或以错误进行响应。不幸的是,ASP.NET Core 2.1 默认支持 JSON,默认情况下,如果使用 Accept: application/json 发出请求,则内容协商过程始终成功。
有谁知道是否可以配置 ASP.NET Core 项目,以便在设置了 XML 以外的任何媒体类型时内容协商过程引发错误?
答:
1赞
agua from mars
9/26/2018
#1
使用 MVC 输入和输出格式化程序:
services.AddMvc(configure =>
{
// remove JSON formatter
var outputFormatters = configure.OutputFormatters;
var jsonOutputFormatter = outputFormatters.First(f => f is JsonOutputFormatter);
outputFormatters.Remove(jsonOutputFormatter);
var inputFormatters = configure.InputFormatters;
var jsonInputFormatter = inputFormatters.First(f => f is JsonInputFormatter);
inputFormatters.Remove(jsonInputFormatter);
}).AddXmlSerializerFormatters()
评论
0赞
RAM
9/27/2018
感谢您发布 anwser。但是,您的解决方案不起作用。我通过发送 GET 请求来测试您的解决方案,您的解决方案返回状态代码为 200 的 XML 文档。预期的响应将是状态代码 406 “不可接受”或“415 不支持的媒体类型”,并伴有空白正文。Accept: application/json
0赞
agua from mars
9/27/2018
您可以将格式化程序配置为不接受 application/json,我认为它默认接受 /,但我没有检查。或者编写一个中间件来检查 accept 标头
0赞
agua from mars
9/27/2018
尝试一下,我更新了我的答案并做了一个测试(),我收到了:AddXmlSerializerFormatters()
curl -X GET "http://localhost:65134/api/v1/application" -H "accept: application/json"
406 Error: Not Acceptable
0赞
RAM
9/27/2018
我已经试过了,但那不起作用。返回状态代码为 200 OK 的 GET 请求,请求正文中包含 JSON 文档。这实际上是添加 XML 的推荐方法,Microsoft 自己的 ASP.NET 核心 2.1 教程中对此进行了介绍,并且它们非常明确地说明了如何使用它来添加对 XML 的支持,同时保持对任何其他媒体类型(包括 JSON)的支持。Accept: application/json
3赞
PKCS12
3/28/2019
#2
对不起,如果我迟到了。这对我有用:
services.AddMvc(options =>
{
options.OutputFormatters.RemoveType(typeof(JsonOutputFormatter));
options.InputFormatters.RemoveType(typeof(JsonInputFormatter));
options.ReturnHttpNotAcceptable = true;
})
.AddXmlSerializerFormatters()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
评论
1赞
RAM
5/4/2019
感谢您抽出宝贵时间发表您的建议!我刚刚用一个全新的项目(dotnet new webapi)进行了测试,您的建议确实有效。它也适用于 .然而,与此同时,我注意到使用会适得其反,因为它只是一个包装器,添加了一堆默认选项,例如 JSON 支持。因此,如果最终目标是不支持 JSON,那么最好的起点是一开始就不包含它。CompatibilityVersion.Version_2_2
AddMvc()
AddMvcCore()
评论