Postman发送含文件的请求参数调用.NET接口报415错误排查
问题原因
返回415 Unsupported Media Type是两个配置错误导致的:
- 接口未显式声明支持
multipart/form-data请求类型。ASP.NET Core默认的输入格式化器仅处理application/json格式的请求体,收到表单格式请求时找不到匹配的格式化器,直接返回415状态码。 - 模型定义存在绑定缺陷。
Content字段声明为object类型时,默认模型绑定器无法自动映射上传的文件流,不管是JSON绑定器还是表单绑定器都无法识别文件与该字段的对应关系。
实现方案
该传参需求完全可以实现,分后端改造、Postman配置两部分操作:
后端改造
- 为接口添加必要特性,强制从表单绑定数据:
[HttpPost("stream")] [Consumes("multipart/form-data")] public async Task<IActionResult> UploadStreamAsync([FromForm] FileUploadRequest request) { // 业务实现代码 }
必须添加[FromForm]特性指定参数绑定源为表单,否则框架仍会默认尝试从JSON体绑定数据
- 调整模型定义,不要用
object作为文件接收字段类型。ASP.NET Core的默认绑定器仅支持用IFormFile类型接收上传的文件,修改后模型如下:
public class FileUploadRequest { public string FileName { get; set; } public string FileType { get; set; } public string Path { get; set; } public IFormFile Content { get; set; } }
如果要兼容Content字段接收JSON、byte[]、Stream三种类型的数据,不要依赖默认模型绑定,需要自行实现IModelBinder接口,根据请求类型判断绑定逻辑:请求为JSON格式时走反序列化逻辑,请求为表单格式时提取文件流转换为对应类型赋值即可。
Postman配置
- 不要手动设置
Content-Type请求头。选择form-data请求体时,Postman会自动生成带正确boundary参数的multipart/form-data请求头,手动设置会因为缺少boundary参数导致请求解析失败。 - 请求体选择
form-data类型,按如下规则填写字段:- 字段名
FileName,类型选Text,值填对应文件名 - 字段名
FileType,类型选Text,值填对应文件类型 - 字段名
Path,类型选Text,值填对应存储路径 - 字段名
Content,类型选File,值选择本地要上传的文件
- 字段名
- 不需要额外封装JSON结构传参,表单绑定器会自动将同名字段映射到模型的对应属性。
之前方案失败的原因
- 第一种逐字段填表单的方案:接口未添加
[Consumes("multipart/form-data")]和[FromForm]特性,框架始终按JSON格式解析请求,根本不会进入表单绑定流程,直接返回415。 - 第二种JSON+文件拆分传参的方案:除了上述接口特性缺失的问题,将其他字段封装为JSON字符串传递时,表单绑定器无法自动拆解JSON内容映射到模型的平级属性,会导致字段绑定为null。
内容的提问来源于stack exchange,提问作者Dror Cohen
相关产品推荐
相关产品推荐

