当我在.NET 6.0中发送json对象和IFormFile时,HttpClient返回不支持的媒体类型错误



在过去的三天里,我一直在努力将复杂类型(称为fileItem的DTO对象(和命名为文件的IFormFile类型的序列化json发送到我的一个API,该API接受两个输入,即FileItem对象和IFormFile对象。

但我一直在犯一个错误";不支持的媒体类型";。注意,当我通过更新端点以仅接受文件或仅接受complexType而仅向API端点发送文件或对象时,它工作正常,但如果我同时发送这两个文件或对象,则我得到";不支持的媒体类型";在我发送的请求中已经存在的错误

请指引我正确的方向,我们将非常感谢您的帮助。

ASP.NET MVC web应用

public async Task<string> SaveFiles(FileItem _fileItem2, IFormFile _file)
{
using (var multipartFormContent = new MultipartFormDataContent())
{
var fileItem = new StringContent(
JsonSerializer.Serialize(_fileItem2), Encoding.UTF8, Application.Json);
multipartFormContent.Add(fileItem, "fileItem");
// Add the file
var fileStreamContent = new StreamContent(_file.OpenReadStream());
fileStreamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(_file.ContentType);
multipartFormContent.Add(fileStreamContent, name: "file", _file.FileName);
// Method 1 : this method returns Unsupported media type, but if file is removed then it works fine.
var response = await httpClient.PostAsync("/Upload/SaveFileWithData", multipartFormContent);
// Method 2 : this method also returns Unsupported media type, but if file is removed then it works fine.
var request = new HttpRequestMessage(HttpMethod.Post, "/Upload/SaveFileWithData");
request.Content = multipartFormContent;
var responsemsg = await httpClient.SendAsync(request);
responsemsg.EnsureSuccessStatusCode();
return await responsemsg.Content.ReadAsStringAsync();
}
}

这是.NET 6.0 Web API(我们向该API发送的上述请求(

[HttpPost()]
[Route("SaveFileWithData")]
public async Task<string> SaveFileWithData(FileItem? fileItem, IFormFile? file)
{
int i = 2;
return "fileSavedSuccessfully";
}

下面是一个完整的工作演示:

型号:

public class FileItem
{
public string FileName { get; set; }
public string Type { get; set; }
}

MVC:

[HttpPost]
public async Task<string> SaveFiles(FileItem _fileItem2, IFormFile _file)
{
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://localhost:7241/");
using (var multipartFormContent = new MultipartFormDataContent())
{
multipartFormContent.Add(new StringContent(_fileItem2.FileName), "FileName");
multipartFormContent.Add(new StringContent(_fileItem2.Type), "Type");
var fileStreamContent = new StreamContent(_file.OpenReadStream());

multipartFormContent.Add(fileStreamContent, name: "file", _file.FileName);
var response = await httpClient.PostAsync("/Upload/SaveFileWithData", multipartFormContent);
//...
}
}

Web APi:

[HttpPost()]
[Route("SaveFileWithData")]
public async Task<string> SaveFileWithData([FromForm]FileItem? fileItem, [FromForm] IFormFile? file)
{
int i = 2;
return "fileSavedSuccessfully";
}

注意:不可为null的属性必须是必需的在ASP.NET 6中,请确保通过HttpClient发布所有属性,否则您将收到400错误请求。

如果您不想要所需的所有属性,可以查看下面的参考:https://stackoverflow.com/a/71701358/11398810

最新更新