当我向我的.net核心2 mvc后端发送请求时,它会返回json数据。
我想选择更改标题,然后我将返回一个csv文件的数据供下载
'Accept': 'text/csv',
'Content-Type': `text/csv; charset=utf-8`
我使用此Produces过滤器设置控制器基类
[Produces("application/json", "text/csv")]
但是这些标题总是会导致.net返回415 Unsupported Media Type
控制器操作如下所示
[HttpPost]
public async Task<IActionResult> Post([FromBody] PostArgs args)
答案 0 :(得分:1)
要返回csv
数据,您需要返回ContentResult
而不是JsonResult
个对象。这允许您定义Content-Type
:
return new ContentResult("csv-data", "text/csv", 200);
如果要返回物理文件,可以返回FileResult个对象。
默认情况下,不会强制执行Accepts
标头。您可以通过配置强制执行:
services.AddMvc(config =>
{
config.RespectBrowserAcceptHeader = true;
});
要接受其他格式,您还需要添加InputFormatters
:
services.AddMvc(config =>
{
config.RespectBrowserAcceptHeader = true;
config.InputFormatters.Add(new TextInputFormatter())
config.OutputFormatters.Add(new StringOutputFormatter());
});
答案 1 :(得分:1)
您的问题来源是Content-Type: text/csv; charset=utf-8
标题。
[FromBody]
迫使MVC中间件使用输入格式化程序进行模型绑定(我说的是PostArgs
模型)。默认情况下,ASP.NET Core只注册一个JSON输入格式化程序。因为您设置了Content-Type
,中间件无法使用该默认格式化程序(因为Content-Type
标题表示请求正文中的数据 应该被处理为CSV而不是JSON),因此它会抛出{ {1}}错误。
... 我想选择性地更改标题,然后我将返回数据的csv文件以供下载
实际上,您似乎以错误的方式理解415 Unsupported Media Type
标题does:
在请求中,(例如POST或PUT),客户端告诉服务器实际发送了什么类型的数据。
换句话说,您只需要指定Accept
header,原因
Content-Type
请求HTTP标头通告哪些内容类型,表示为MIME类型,客户端能够理解。使用内容协商,服务器然后选择其中一个提议。
然后是服务器,他在响应中使用Accept
标头告诉客户端返回内容的内容类型(作为响应)实际上是什么。