ASPNetCore API内容协商不起作用
问题描述:
我试图让我的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不可接受的响应。
答
我终于找到正确的设置,通过接受标题返回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();
});
很简单,当你知道如何!现在有太多不正确的文档了!
您应该使用'services.AddMvc()。AddXmlSerializerFormatters();'来添加XML序列化程序,这样会更容易一些。之前我有过类似的问题,原因是我返回的对象。你能说明你正在返回什么样的数据结构吗? – juunas
@juunas完全替换掉了我的services.AddMvc,它仍然返回JSON! – Smithy