向API发送StreamContent与StringContent时遇Unsupported Media Type问题求助
解决Multipart上传文件+字符串参数的"Unsupported Media Type"问题
问题根源
- 客户端代码错误:
- 序列化逻辑错误:
JsonConvert.SerializeObject(data.ToString())会把对象的类型名称(如<>f__AnonymousType01[System.String]`)序列化,而非实际的JSON结构。 - 字符串内容未指定参数名:MultipartFormDataContent中的StringContent没有设置name属性,导致API无法识别对应的参数。
- 序列化逻辑错误:
- API端接收方式错误:
[FromBody]用于接收请求体为JSON/XML格式的参数,不适用于Multipart/form-data类型的表单参数,这类参数需直接从表单绑定接收。
修正后的代码
客户端代码
如果只需传递普通字符串参数,可简化为:
var modeValue = info; // 假设info是你的目标字符串变量 var content = new MultipartFormDataContent { { new StreamContent(frontStream), "front", front.FullName }, { new StreamContent(backStream), "back", back.FullName }, // 指定参数名为"mode",与API端参数名对应 { new StringContent(modeValue, Encoding.UTF8), "mode" } }; using var client = new HttpClient(); var response = await client.PostAsync($"https://localhost:987987987/Upload", content);
如果需要传递JSON格式的参数(比如mode是复杂对象),修正序列化逻辑:
var data = new { mode = info }; // 直接序列化data对象,而非data.ToString() var pathData = JsonConvert.SerializeObject(data); var content = new MultipartFormDataContent { { new StreamContent(frontStream), "front", front.FullName }, { new StreamContent(backStream), "back", back.FullName }, // 指定参数名,并设置正确的媒体类型 { new StringContent(pathData, Encoding.UTF8, "application/json"), "mode" } }; using var client = new HttpClient(); var response = await client.PostAsync($"https://localhost:987987987/Upload", content);
API端代码
接收普通字符串参数的版本:
[HttpPost("Upload")] public async Task<IActionResult> Post(IFormFile front, IFormFile back, string mode) { // 编写你的业务处理逻辑 return Ok(); }
如果接收JSON格式的对象参数,需定义模型类配合接收:
public class ModeRequest { public string Mode { get; set; } } [HttpPost("Upload")] public async Task<IActionResult> Post(IFormFile front, IFormFile back, [FromForm] ModeRequest mode) { // 通过mode.Mode获取参数值 return Ok(); }
关键说明
- Multipart/form-data请求中,所有参数(文件和普通数据)都属于表单内容,API端默认从表单绑定参数,无需
[FromBody],显式使用[FromForm]也可。 - 客户端添加Multipart内容时,必须为每个参数指定与API端一致的name,否则参数无法被正确识别。
内容的提问来源于stack exchange,提问作者Queen Mochi
相关产品推荐
相关产品推荐

