9

我正在尝试设置我的 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

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

        // 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,或者如果 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);
    }

我正在尝试返回这个 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 响应。

4

1 回答 1

14

我终于找到了通过接受标头返回 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();
    });

当你知道怎么做时很简单!现在有很多不正确的文档!

于 2017-03-08T10:32:14.010 回答