.net Core WebApi内容协商

时间:2017-09-22 15:51:32

标签: .net asp.net-web-api asp.net-core

我正在尝试将CS​​V输出格式化程序添加到我的.NET Core 1.1 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();
}

我的问题是,如果我删除了produce属性并且没有发送接受标头,我仍然会得到一个csv。他怎么知道发回CSV?我的其他方法仍然产生JSON,它应该如何,我只是不明白为什么这是,我担心它会导致问题。

1 个答案:

答案 0 :(得分:1)

内容协商是框架的一部分,但您需要更新操作以利用此功能。

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

要引用原始帖子中链接的回购,请查看其documentation

中的以下内容
  

Get方法使用HTTP中的Accept标头导出数据   请求。默认情况下,将返回Json。如果接受标题是   设置为'text / csv',数据将以csv的形式返回。 GetDataAsCsv   方法始终返回csv数据,因为使用了Produces属性   迫使这个。

// 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 Core只有Json(可能是纯文本)   作为内容类型。

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

请注意,对RespectBrowserAcceptHeader的调用是错误的   默认,所以如果你想要内容协商,你必须启用它。

参考Content Negotiation in ASP.NET Core