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

很簡單,當你知道如何!現在有太多不正確的文檔了!