如何在.NET Core API中接收MultipartFormDataContent并解决415错误
问题定位
你遇到的Unsupported Media Type错误核心原因出在接收文件的API参数绑定逻辑错误:
[FromBody]特性仅支持解析application/json、application/xml这类序列化的单一体请求内容,无法处理你发送的multipart/form-data格式的多部分请求- ASP.NET Core 原生不支持直接将
MultipartFormDataContent作为控制器接口参数进行自动绑定
修复方案
第一步:修改接收端API的参数绑定逻辑
推荐用自定义模型绑定的方式同时接收文件和附加JSON数据:
- 先定义接收模型
public class SendMailRequest { // 对应你上传的文件字段,多文件可改为List<IFormFile>类型 public IFormFile File { get; set; } // 对应你发送的data字段,存储序列化后的JSON字符串 public string Data { get; set; } }
- 调整接口定义,将
[FromBody]改为[FromForm]
[HttpPost("apisendfile")] public async Task<ActionResult> SendMail([FromForm] SendMailRequest formData) { // 反序列化得到你的业务参数 // var businessData = JsonConvert.DeserializeObject<你发送端序列化的request对应的类>(formData.Data); // 处理文件:formData.File.OpenReadStream()即可读取文件流 }
如果你不想额外定义模型,也可以直接读取请求表单内容:
[HttpPost("apisendfile")] public async Task<ActionResult> SendMail() { var formData = await Request.ReadFormAsync(); var dataJson = formData["data"].FirstOrDefault(); var file = formData.Files["File"]; // 后续业务逻辑 }
第二步:可选优化发送端逻辑
部分.NET Core版本解析multipart/form-data的边界参数时,遇到双引号会解析失败,可以在发送端调用PostAsync前添加以下代码规避:
// 移除边界参数的双引号,避免服务端解析异常 var boundaryParameter = multipartFormData.Headers.ContentType.Parameters.First(p => p.Name == "boundary"); boundaryParameter.Value = boundaryParameter.Value.Replace("\"", string.Empty);
内容的提问来源于stack exchange,提问作者Mr Perfect
相关产品推荐
相关产品推荐

