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

C# 内容协商:如何删除JSON作为受支持的格式?,c#,rest,asp.net-core,asp.net-core-webapi,C#,Rest,Asp.net Core,Asp.net Core Webapi,我正在ASP.NETCore2.1中基于专门支持XML的规范实现一个web服务。因此,内容协商过程必须返回XML文档或返回错误。不幸的是,ASP.NET Core 2.1默认支持JSON,并且在默认情况下,如果使用Accept:application/JSON发出请求,则内容协商过程始终成功 有人知道是否可以配置ASP.NET核心项目,以便在设置了XML以外的任何媒体类型时,内容协商过程会引发错误吗?使用MVC输入和输出格式化程序: services.AddMvc(configure =>

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


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

使用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()

如果我来晚了,对不起。这对我很有用:

        services.AddMvc(options =>
        {
            options.OutputFormatters.RemoveType(typeof(JsonOutputFormatter));
            options.InputFormatters.RemoveType(typeof(JsonInputFormatter));
            options.ReturnHttpNotAcceptable = true;
        })
        .AddXmlSerializerFormatters()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

注意:重复->接受答案适用于1.0。新的2.x方法是评论+其他答案。在我看来,这个问题不一样。这是关于添加XML,而不是删除JSON。当您说“独占支持XML”时,您是指带有一些自定义XML响应的SOAP或HTTP吗。对于SOAP,您应该查看WCF。@PanagiotisKanavos我的意思是禁用对XML以外的任何编码的支持。默认情况下,asp.net core 2.1包含JSON作为受支持的输出格式,但某些特定API规范不包含JSON。因此,为了更好地实现这些API,内容协商阶段必须拒绝除实际支持的格式之外的任何格式。@RAM我问了其他问题。如果XML实际上是SOAP,那么不要使用WebAPI或MVC。SOAP不仅仅是SOAP,它是一整套已经由WCF实现和处理的WS-*互操作性标准。但是,您的解决方案不起作用。我已经通过发送带有
Accept:application/json
的GET请求测试了您的解决方案,您的解决方案返回了一个状态代码为200的XML文档。预期的响应将是状态代码406不可接受或415不受支持的媒体类型,并带有一个空白正文。您可以将格式化程序配置为不接受application/json,我认为默认情况下它接受/但我没有检查。或者编写一个中间件,用
AddXmlSerializerFormatters()
检查accept headerTry。相反,我更新了答案并进行了测试(
curl-X GET“http://localhost:65134/api/v1/application“-H”accept:application/json“
),我收到:
406错误:不可接受
我已经尝试过了,但不起作用。使用
Accept:application/json
获取请求,并在请求正文中使用json文档返回状态代码200 OK。这实际上是添加XML的推荐方法,在中有介绍,它们非常明确地说明了如何使用它来添加对XML的支持,同时保持对任何其他媒体类型的支持,包括JSON。@RAM您发布的链接显示您可以使用
[products]
属性来限制支持的内容类型,即使感谢您花时间发布您的建议!我刚刚测试了一个全新的项目(dotnet new webapi),您的建议确实有效。它还适用于兼容Version.Version\u 2\u 2。然而,与此同时,我注意到使用
AddMvc()
会适得其反,因为它只是
AddMvcCore()
的包装,添加了一系列默认选项,例如JSON支持。因此,如果最终目标是不支持JSON,那么最好的起点就是不包含它。