内容协商:如何删除JSON作为支持的格式?

Content negotiation: how to remove JSON as a supported format?

提问人:RAM 提问时间:9/26/2018 更新时间:3/28/2019 访问量:2631

问:

我正在 ASP.NET Core 2.1 中实现一个基于专门支持 XML 的规范的 Web 服务。因此,内容协商过程必须返回 XML 文档或以错误进行响应。不幸的是,ASP.NET Core 2.1 默认支持 JSON,默认情况下,如果使用 Accept: application/json 发出请求,则内容协商过程始终成功。

有谁知道是否可以配置 ASP.NET Core 项目,以便在设置了 XML 以外的任何媒体类型时内容协商过程引发错误?

C# REST ASP.NET-CORE-WebAPI

评论

1赞 Peter B 9/26/2018
关于重复的注意事项 -> 接受的答案是 1.0。较新的 2.x 方法在评论 + 其他答案中。
1赞 Martin Smith 9/26/2018
对我来说看起来不像是同一个问题。这是关于添加 XML,而不是删除 JSON。
0赞 Panagiotis Kanavos 9/27/2018
当您说“完全支持 XML”时,您指的是带有某些自定义 XML 响应的 SOAP 还是 HTTP。对于 SOAP,您应该查看 WCF。
0赞 RAM 9/27/2018
@PanagiotisKanavos我的意思是禁用对 XML 以外的任何编码的支持。默认情况下 asp.net 核心 2.1 包含 JSON 作为支持的输出格式,但某些临时 API 规范没有。因此,为了更好地实现这些 API,内容协商阶段必须拒绝实际支持的格式以外的任何格式。
0赞 Panagiotis Kanavos 9/27/2018
@RAM我问了别的问题。如果该 XML 实际上是 SOAP,请不要使用 Web API 或 MVC。SOAP 不仅仅是 SOAP,它是一整套 WS-* 互操作性标准,这些标准已经由 WCF 实现和处理。

答:

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
0赞 Panagiotis Kanavos 9/27/2018
@RAM您发布的链接显示,即使在全局级别,您也可以使用该属性来限制支持的内容类型[Produces]
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_2AddMvc()AddMvcCore()