.NET 6中HttpClient同时传JSON对象与IFormFile报Unsupported Media Type错误
问题:同时发送DTO对象与IFormFile时触发"Unsupported Media Type"错误
我花了三天时间尝试把名为fileItem的复杂类型DTO序列化后的JSON,和名为file的IFormFile类型数据一起发送给Web API,该API接收FileItem对象与IFormFile对象作为输入,但一直收到“Unsupported Media Type”错误。
注意:单独发送文件,或者单独发送对象(同时修改API端点只接收其中一种类型)都能正常运行,但同时发送两者就会触发错误。
ASP.NET MVC客户端代码
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"); // 添加文件 var fileStreamContent = new StreamContent(_file.OpenReadStream()); fileStreamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(_file.ContentType); multipartFormContent.Add(fileStreamContent, name: "file", _file.FileName); // 方式1:返回Unsupported media type,移除文件则正常 var response = await httpClient.PostAsync("/Upload/SaveFileWithData", multipartFormContent); // 方式2:同样返回Unsupported media type,移除文件则正常 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代码
[HttpPost()] [Route("SaveFileWithData")] public async Task<string> SaveFileWithData(FileItem? fileItem, IFormFile? file) { int i = 2; return "fileSavedSuccessfully"; }
解决方向
1. 为API参数添加[FromForm]特性
ASP.NET Core默认不会自动从multipart/form-data请求中绑定复杂类型DTO,必须显式指定参数来源。修改API方法:
[HttpPost()] [Route("SaveFileWithData")] public async Task<string> SaveFileWithData([FromForm] FileItem? fileItem, [FromForm] IFormFile? file) { int i = 2; return "fileSavedSuccessfully"; }
2. 调整客户端DTO的表单提交格式
当前客户端将DTO序列化为JSON字符串提交,但[FromForm]默认期望表单字段为键值对格式,而非JSON字符串,可二选一处理:
- 拆分DTO属性为独立表单字段
把FileItem的每个属性单独作为表单字段添加,示例:multipartFormContent.Add(new StringContent(_fileItem2.Id.ToString()), "fileItem.Id"); multipartFormContent.Add(new StringContent(_fileItem2.Name), "fileItem.Name"); // 其他属性依次添加 - 保持JSON字符串,API手动反序列化
API端将fileItem参数改为string类型,接收后手动反序列化:
同时客户端调整字段名:[HttpPost()] [Route("SaveFileWithData")] public async Task<string> SaveFileWithData([FromForm] string? fileItemJson, [FromForm] IFormFile? file) { var fileItem = JsonSerializer.Deserialize<FileItem>(fileItemJson); // 后续业务逻辑 return "fileSavedSuccessfully"; }multipartFormContent.Add(fileItem, "fileItemJson");
3. 确认请求内容类型
客户端的MultipartFormDataContent默认会设置正确的multipart/form-data内容类型,无需额外修改,确保代码中没有意外覆盖该设置即可。
内容的提问来源于stack exchange,提问作者Raz Muhammad
相关产品推荐
相关产品推荐

