当我将Accept设置为text / csv时,.net core 2拒绝415的请求

时间:2018-03-30 17:19:32

标签: asp.net-mvc asp.net-core asp.net-core-2.0

当我向我的.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)

2 个答案:

答案 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标头告诉客户端返回内容的内容类型(作为响应)实际上是什么。