2017-09-22 16 views
3

.NET Core 1.1 WebApiにCSV出力フォーマッタを追加しようとしています。.netコアWebApiコンテンツネゴシエーション

WebAPIContrib.Coreパッケージ(https://github.com/damienbod/WebAPIContrib.Core/tree/master/src/WebApiContrib.Core.Formatter.Csv)をインストールしました。

私のスタートアップは、次のようになります。

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

私のコントローラメソッドが完全に汎用的であり、この

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

私の問題は、私は削除する場合は、属性を生成して送信しないということであるように見えます受け入れヘッダー私はまだcsvを取得します。彼はCSVを返信する方法をどのように知ることができますか?他の方法でもJSONが生成されますが、これはどうして私はちょうどこれがなぜなのか理解できないはずです。私はそれが問題を引き起こすのではないかと心配しています。

答えて

1

コンテンツネゴシエーションはフレームワークの一部ですが、これを利用するにはアクションを更新する必要があります。 Get方法はHTTP リクエストにAcceptヘッダーを使用してデータをエクスポートし、そのdocumentation

から以下を見て、元の記事にリンクされたリポジトリを引用する

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

。デフォルトでは、Jsonが返されます。 Accept Headerが が 'text/csv'に設定されている場合、データはcsvとして返されます。 メソッドは、強制的にProduces属性が に使用されているため、常にcsvデータを返します。マニュアルに示されているように

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

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

また、あなたは、起動中にそれを正しく設定されていることを確認しなければなりません。

ASP.NETコアには、コンテンツタイプとしてJson(およびおそらくプレーンテキスト) しかありません。

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

RespectBrowserAcceptHeaderへの呼び出しが デフォルトではfalseですので、あなたがコンテントネゴシエーションをしたい場合、あなたはこれを有効にする必要があることに注意してください。

リファレンスContent Negotiation in ASP.NET Core

+0

それはWEBAPIだので、私はAddMvcを使用したくないと私はカミソリを必要としません。 AddMvcCoreはまったく同じことをすることができます。追加したいサービスを指定するだけです。私の問題は、受け入れるヘッダーを指定して生成属性を削除しても、まだCSVが得られないということです。これは意味をなさないものです。 – Narcil

+0

戻り値Ok(_someService.GetData())を追加しても何も変更されません。私はまだ生産属性と受け入れヘッダーなしのCSVを取得します。 – Narcil

+0

フォーマッタを追加する順序を確認してください。また、JSONが返されたインスタンスの1つを表示してください – Nkosi