我試圖讓我的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不可接受的響應。
您應該使用'services.AddMvc()。AddXmlSerializerFormatters();'來添加XML序列化程序,這樣會更容易一些。之前我有過類似的問題,原因是我返回的對象。你能說明你正在返回什麼樣的數據結構嗎? – juunas
@juunas完全替換掉了我的services.AddMvc,它仍然返回JSON! – Smithy