C# Postman文件和json返回415,即使内容类型为Header.net core

C# Postman文件和json返回415,即使内容类型为Header.net core,c#,asp.net-web-api,asp.net-core,postman,C#,Asp.net Web Api,Asp.net Core,Postman,我正在使用postman测试我的.net核心API,当我试图通过postman表单数据发布数据时,即使我将内容类型头设置为application/json,也会返回415,因为此问题的常见解决方案似乎是在线的。 如果我通过raw postman选项在没有任何文件的情况下发出请求,并将内容类型设置为JSONapplication/json,那么该请求将成功到达API 以下是我的API的外观: [HttpPost("{organization}")] public IActionResul

我正在使用postman测试我的.net核心API,当我试图通过postman表单数据发布数据时,即使我将内容类型头设置为application/json,也会返回415,因为此问题的常见解决方案似乎是在线的。 如果我通过raw postman选项在没有任何文件的情况下发出请求,并将内容类型设置为JSONapplication/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]);
    }
下面是失败的邮递员请求的样子

以及该请求的标头

我还缺少什么才能让它发挥作用

小更新


如果我删除[FromBody]Asset Asset并只传递该文件,这就可以了。结果证明,出于某种奇怪的原因,我不允许将其中任何一个作为控制器的变量传递,但如果我从请求中检索到这两个文件,这就可以了


不知道为什么会这样,如果有人能向我解释一下,我会很感激,但这似乎解决了我的问题。

尝试使用[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中,由于您正在发出表单数据请求,您的内容类型最终将是多部分/表单数据。如果您在处理请求时调试该请求,您可以看到内容类型更改为多部分,即使您将其设置为application/json。


但是,在控制器的POST操作中,您指定希望主体中有一个资产对象,默认情况下,主体需要一个JSON对象。因此,由于您的请求的内容类型是multipart,而您的API需要application/json,因为您使用了[FromBody]属性,所以您得到了415。非常好,感谢您的解释,这非常有意义。我已经检查过了,它已经起作用了。
var file = equest.Form.Files[0]
 [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);
    }