我正在尝试将CSV输出格式化程序添加到我的.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,它应该如何,我只是不明白为什么这是,我担心它会导致问题。
答案 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
的调用是错误的 默认,所以如果你想要内容协商,你必须启用它。