即使使用Content-Type Header .net核心,邮递员文件和json也会返回415

时间:2017-05-30 11:02:15

标签: c# asp.net-web-api asp.net-core postman

我正在使用邮递员来测试我的.net核心API,当我尝试通过邮递员表单发布数据时,即使我将Content-Type标头设置为application / json作为此通用解决方案,这也会返回415问题似乎在线。 如果我通过raw postman选项触发没有任何文件的请求,并将内容类型设置为JSON(application / json),则此请求将成功到达API。

以下是我的API的外观:

 [HttpPost("{organization}")]
    public IActionResult Post([FromBody] Asset asset, string organization)
    {
       //Api body
       //Get files from request
       Task uploadBlob = BlobFunctions.UploadBlobAsync(_blobContainer,Request.Form.Files[0]);
    }

以下是失败的邮递员请求的样子 enter image description here

和该请求的标题

enter image description here

我还缺少什么工作?

小更新

如果我删除[FromBody]Asset asset并只传递文件

,这样可以正常工作

2 个答案:

答案 0 :(得分:1)

尝试使用[FromForm]属性而不是[FromBody]属性:

 [HttpPost("{organization}")]
    public IActionResult Post([FromForm] string asset, string organization, IFormFile fileToPost)
    {
       //Api body
       Asset asset = JsonConvert.DeserializeObject<Asset>(asset);
       //Get files from request
       Task uploadBlob = BlobFunctions.UploadBlobAsync(_blobContainer, fileToPost);
    }

我不能肯定地说,但我的猜测是,在postman中,因为你正在制作一个表单数据请求,你的内容类型最终将成为“multipart / form-data”(如果你调试了在处理它时,您可以看到内容类型更改为multipart,即使您将其设置为application / json)。

但是在Controller的POST操作中,您指定期望来自正文的Asset对象(默认情况下需要JSON对象)。所以你得到一个415因为你的请求的内容类型是multipart而你的API需要application / json,因为你使用了[FromBody]属性。

答案 1 :(得分:0)

事实证明,由于一些奇怪的原因,我不允许将它们中的任何一个作为我的控制器的变量传递,但是如果我从Request检索它们,它就会起作用。

 if (!Request.Form.ContainsKey("asset"))
 {
    return BadRequest("Asset cannot be empty");
 }
 Asset asset = JsonConvert.DeserializeObject<Asset>(Request.Form.First(a => a.Key == "asset").Value);

和文件

var file = equest.Form.Files[0]

不确定为什么会出现这种情况,如果有人能向我解释这一点,我会很感激,但这似乎解决了我的问题。