[英].net Core WebApi Content Negotiation
我正在嘗試將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,它應該是怎么樣我只是不明白為什么這是,我擔心它會引起問題。
內容協商是框架的一部分,但您需要更新操作以利用此功能。
[HttpGet("/api/export")]
public async Task<IActionResult> GetData() {
List<Data> data = await _someService.GetData();
return Ok(data); // <-- returns OkObjectResult with content negotiation baked in
}
Get
方法使用HTTP請求中的Accept標頭導出數據。 默認情況下,將返回Json。 如果Accept Header設置為'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
的調用為false,因此如果要進行內容協商,則必須啟用此功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.