2017-09-22 3 views
3

Ich versuche, einen CSV-Ausgabeformatierer zu meinem .NET Core 1.1 WebApi hinzuzufügen..net Core WebApi Inhalt Verhandlung

Ich habe das WebAPIContrib.Core-Paket (https://github.com/damienbod/WebAPIContrib.Core/tree/master/src/WebApiContrib.Core.Formatter.Csv) installiert.

My Startup nun so aussehen:

var csvFormatterOptions = new CsvFormatterOptions(); 
services.AddMvcCore(options => 
{ 
    options.OutputFormatters.Add(new CsvOutputFormatter(csvFormatterOptions)); 
    options.FormatterMappings.SetMediaTypeMappingForFormat("csv", MediaTypeHeaderValue.Parse("text/csv")); 
}) 
.AddJsonFormatters() 
.AddJsonOptions(options => new SerializationHelper().Configure(options.SerializerSettings)); 

Mein Controller-Methode vollständig generisch ist und sieht wie folgt aus

[HttpGet("/api/export")] 
[Produces("text/csv")] 
public async Task<List<Data>> GetDataAsCsv() 
{ 
    return await _someService.GetData(); 
} 

Mein Problem ist, dass, wenn ich das Attribut entfernen produziert und nicht senden ein Akzeptieren Header Ich bekomme immer noch eine CSV. Wie kann er wissen, eine CSV zurückzusenden? Meine anderen Methoden produzieren immer noch JSON, so wie es sein sollte, ich verstehe einfach nicht, warum das so ist, und ich fürchte, es wird ein Problem auf der ganzen Linie verursachen.

Antwort

1

Inhaltsverhandlung ist Teil des Frameworks, aber Sie müssen die Aktion aktualisieren, um dies zu nutzen.

[HttpGet("/api/export")] 
public async Task<IActionResult> GetData() { 
    List<Data> data = await _someService.GetData(); 
    return Ok(data); // <-- returns OkObjectResult with content negotiation baked in 
} 

Um die in der ursprünglichen Nachricht verknüpft Repo zitieren, Blick auf die folgenden von seiner documentation

Die Get Methode exportiert die Daten der Anfrage im HTTP-Accept-Header verwendet wird. Standardmäßig wird Json zurückgegeben. Wenn der Accept Header auf 'text/csv' festgelegt ist, werden die Daten als CSV zurückgegeben. Die Methode GetDataAsCsv gibt immer CSV-Daten zurück, da das Produces-Attribut verwendet wird, um dies zu erzwingen.

// GET api/csvtest 
[HttpGet] 
public IActionResult Get() { 
    return Ok(DummyData()); 
} 

[HttpGet] 
[Route("data.csv")] 
[Produces("text/csv")] 
public IActionResult GetDataAsCsv() { 
    return Ok(DummyData()); 
} 

Auch in der Dokumentation, wie angegeben, sollten Sie sicherstellen, dass Sie es richtig in Inbetriebnahme konfigurieren.

Standardmäßig enthält ASP.NET Core nur Json (und möglicherweise Klartext) als Inhaltstypen.

var csvOptions = new CsvFormatterOptions(); 
services.AddMvcCore(options => { 
     options.RespectBrowserAcceptHeader = true; 
    }) 
    .AddJsonFormatters() 
    .AddJsonOptions(options => new SerializationHelper().Configure(options.SerializerSettings)) 
    .AddCsvSerializerFormatters(csvOptions); 

Beachten Sie, dass der Aufruf von RespectBrowserAcceptHeader von Standard falsch ist, also, wenn Sie Content Negotiation möchten, können Sie dies ermöglichen haben.

Referenz Content Negotiation in ASP.NET Core

+0

Ich will nicht AddMvc verwenden, da es sich um ein WebAPI ist und ich Razor nicht brauchen. AddMvcCore kann genau dasselbe tun, ich muss nur die Dienste angeben, die ich hinzufügen möchte. Mein Problem ist, dass, wenn ich * nicht * einen accept-Header spezifiziere und das Attribut products entferne, ich immer noch einen csv bekomme, was für mich keinen Sinn ergibt. – Narcil

+0

Versucht, Return zurückzugeben Ok (_someService.GetData()) ändert nichts. Ich bekomme immer noch eine CSV ohne das Attribut produziert und ohne einen Kopf akzeptieren. – Narcil

+0

Überprüfen Sie die Reihenfolge, in der Sie die Formatierer hinzufügen. Zeigen Sie auch eine der Instanzen, wo JSON zurückgegeben wird – Nkosi

Verwandte Themen