1

我试图让我的api设置,所以它会根据Accept头以XML或JSON响应。ASPNetCore API内容协商不起作用

我下面的教程肖恩宽: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

他说:将此添加到启动配置服务部分:

 // 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(); 
      }); 

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

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

如何让我的api默认返回Json,或者如果接受存在则返回XML?

编辑1:

我用这个作为我的HTTP GET代码:

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

而且我试图返回这个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 
} 

编辑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(); 
      }); 

,并与下面的替换:

 services.AddMvc().AddXmlSerializerFormatters(); 

然后把[Produces("application/xml")]我上面的get方法,我收到了406不可接受的响应。

+1

您应该使用'services.AddMvc()。AddXmlSerializerFormatters();'来添加XML序列化程序,这样会更容易一些。之前我有过类似的问题,原因是我返回的对象。你能说明你正在返回什么样的数据结构吗? – juunas

+0

@juunas完全替换掉了我的services.AddMvc,它仍然返回JSON! – Smithy

回答

4

我终于找到正确的设置,通过接受标题返回JSON和XML。

为了让您的网络API控制器(默认情况下JSON)返回JSON或XML你需要你的服务的配置是这样的:

// 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(); 
    }); 

很简单,当你知道如何!现在有太多不正确的文档了!