1

Ich versuche, meine API einzurichten, so wird es mit XML oder JSON abhängig von der Accept-Header antworten.ASPNetCore API Inhaltsverhandlung funktioniert nicht

ich nach dem Tutorial von Shawn W: https://wildermuth.com/2016/03/16/Content_Negotiation_in_ASP_NET_Core

Es sagt, ein Paket hinzuzufügen: "Microsoft.AspNet.Mvc.Formatters.Xml": "6.0.0-rc1-final"

Aber ich kann es nicht statt finden, so installiert: Microsoft.AspNetCore.Mvc.Formatters.Xml

Er sagt, dies dem Abschnitt "config services" im Startmenü hinzuzufügen:

Dann Der Browser ist automatisch für den Empfang von XML vorgesehen, da er standardmäßig Accept: text/xml header verwendet, XML nicht in meinem Browser oder mithilfe von postman. Ich bekomme Json, egal was ich Accept Header gesetzt habe.

Ich habe versucht, setzen [Produces("application/xml")] auf meinem Controller und es gibt eine leere 200 OK-Seite.

Wie bekomme ich meine API, um JSON standardmäßig zurückzugeben, oder XML, wenn Accept vorhanden ist?

Edit 1:

Ich benutze dies als meine http-Code erhalten:

[HttpGet] 
    public IActionResult Get() { 
     var invoices = context.Invoices.ToList(); 
     var mappedInvoices = mapper.Map<List<DomainModels.Invoice>, List<Invoice>>(invoices); 
     return Ok(mappedInvoices); 
    } 

Und ich versuche, diese DTO zurückzukehren:

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 
} 

bearbeiten 2:

Wenn ich dieses auslagern:

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

und ersetzen mit der unten:

 services.AddMvc().AddXmlSerializerFormatters(); 

Und dann [Produces("application/xml")] Methode über meiner get setzen bekomme ich eine 406 Not Acceptable Antwort.

+1

Sie sollten die XML-Serialisierer hinzufügen mit 'services.AddMvc(). AddXmlSerializerFormatters();', es ist ein bisschen einfacher. Ich hatte ein ähnliches Problem vorher, der Grund war dann das Objekt, das ich zurückgab. Können Sie zeigen, welche Art von Datenstruktur Sie zurückgeben? – juunas

+0

@juunas Habe meine services.AddMvc komplett für dich ausgetauscht und es gibt immer noch JSON zurück! – Smithy

Antwort

4

Ich fand schließlich die richtige Einstellung, um JSON und XML über akzeptieren Header zurückzugeben.

Um Ihre Web-API-Controller zurückzukehren JSON oder XML (JSON Standardeinstellung) Sie benötigen, um Ihre Dienste-Konfiguration wie folgt aussehen zu erhalten:

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

Ganz einfach, wenn Sie wissen, wie! Es gibt so viele falsche Dokumente, die im Moment herumliegen!

Verwandte Themen