ASPNetCore API内容协商不起作用

Smi*_*thy 8 xml content-negotiation asp.net-web-api http-accept-header asp.net-core

我正在尝试设置我的api,以便根据Accept标头响应XML或JSON.

我正在关注Shawn W的教程:https://wildermuth.com/2016/03/16/Content_Negotiation_in_ASP_NET_Core

它说要添加一个包: "Microsoft.AspNet.Mvc.Formatters.Xml": "6.0.0-rc1-final"

但我无法找到它而是安装: Microsoft.AspNetCore.Mvc.Formatters.Xml

他说要将它添加到Startup中的配置服务部分:

        // Add framework services.
        services
            .AddMvc(options => {
                options.RespectBrowserAcceptHeader = true;
                options.InputFormatters.Add(new XmlSerializerInputFormatter());
                options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
            }).AddJsonOptions(options => {
                // Force Camel Case to JSON
                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            });
Run Code Online (Sandbox Code Playgroud)

然后浏览器自动接收XML,因为默认情况下它使用Accept:text/xml标头,我在浏览器中不使用XML或使用邮递员.无论我将Accept头设置为什么,我都会得到Json.

我试过戴上[Produces("application/xml")]我的控制器,它返回一个空白的200 OK页面.

如何让我的api默认返回Json,如果存在Accept,则返回XML?

编辑1:

我正在使用它作为我的http获取代码:

    [HttpGet]
    public IActionResult Get() {
        var invoices = context.Invoices.ToList();
        var mappedInvoices = mapper.Map<List<DomainModels.Invoice>, List<Invoice>>(invoices);
        return Ok(mappedInvoices);
    }
Run Code Online (Sandbox Code Playgroud)

而我正试图归还这个DTO:

public class Invoice : TrackedObject {

    public DateTime Date { get; set; }

    public decimal Total { get; set; }

    public string OrderNumber { get; set; }


    public PaymentType? PaymentType { get; set; }

    public ICollection<InvoiceItem> Items { get; set; }
}
public enum PaymentType {
    Cheque,
    Cash,
    Card,
    Account
}
Run Code Online (Sandbox Code Playgroud)

编辑2:

如果我换掉这个:

 // Add framework services.
        services
            .AddMvc(options => {
                options.RespectBrowserAcceptHeader = true;
                options.InputFormatters.Add(new XmlSerializerInputFormatter());
                options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
            }).AddJsonOptions(options => {
                // Force Camel Case to JSON
                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            });
Run Code Online (Sandbox Code Playgroud)

并替换为以下:

        services.AddMvc().AddXmlSerializerFormatters();
Run Code Online (Sandbox Code Playgroud)

然后把[Produces("application/xml")]我的get方法放在上面,我得到一个406 Not Acceptable响应.

Smi*_*thy 10

我终于找到了正确的设置,通过accept头返回JSON和XML.

要使您的Web API控制器返回JSON或XML(默认为JSON),您需要将服务配置如下所示:

// Add framework services.
services
    .AddMvc(options => {
        options.RespectBrowserAcceptHeader = true;
    })
    //support application/xml
    .AddXmlDataContractSerializerFormatters()
    //support application/json
    .AddJsonOptions(options => {
        // Force Camel Case to JSON
        options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    });
Run Code Online (Sandbox Code Playgroud)

当你知道如何时非常简单!一分钟都有不正确的文档!