ASPNetCore API 内容协商不工作
ASPNetCore API Content negotiation not working
我正在尝试设置我的 api,以便它根据接受 header.[=21= 以 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
他说要将其添加到启动中的配置服务部分:
// 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 因为默认情况下它使用接受:text/xml header,我在浏览器中没有收到 XML 或通过使用邮递员。无论我将 Accept header 设置为什么,我都会得到 Json。
我试过将 [Produces("application/xml")]
放在我的控制器上,它 return 是一个空白的 200 OK 页面。
如何让我的 api 默认变为 return 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);
}
我正在尝试 return 这个 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 Not Acceptable 响应。
我终于通过接受 headers.
找到 return JSON 和 XML 的正确设置
要让您的网络 API 控制器成为 return 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();
});
当你知道怎么做时,非常简单!目前有太多不正确的文档!
我正在尝试设置我的 api,以便它根据接受 header.[=21= 以 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
他说要将其添加到启动中的配置服务部分:
// 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 因为默认情况下它使用接受:text/xml header,我在浏览器中没有收到 XML 或通过使用邮递员。无论我将 Accept header 设置为什么,我都会得到 Json。
我试过将 [Produces("application/xml")]
放在我的控制器上,它 return 是一个空白的 200 OK 页面。
如何让我的 api 默认变为 return 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);
}
我正在尝试 return 这个 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 Not Acceptable 响应。
我终于通过接受 headers.
找到 return JSON 和 XML 的正确设置要让您的网络 API 控制器成为 return 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();
});
当你知道怎么做时,非常简单!目前有太多不正确的文档!