.NET 5 API控制器处理带boundary的multipart/form-data请求提取JSON方案咨询
解决方案
.NET 5 原生内置了 multipart/form-data 格式的解析能力,无需手动切割字符串处理 boundary,可直接通过 Request.ReadFormAsync() 方法完成解析,步骤如下:
最简实现(无需自定义模型绑定)
直接在接口方法中调用原生表单读取接口,提取对应字段反序列化即可:
[HttpPost] [Route("[action]")] // 注意把返回值改为异步 Task 避免同步阻塞 public async Task<IActionResult> YYYYYYY() { // 原生自动解析 boundary 拆分所有表单字段 var formData = await Request.ReadFormAsync(); // 提取name为ZZZZZZZZZZ的字段的JSON内容 string jsonStr = formData["ZZZZZZZZZZ"]; // 反序列化为目标对象,可根据自己的技术栈选择 System.Text.Json 或 Newtonsoft.Json var targetObj = System.Text.Json.JsonSerializer.Deserialize<YourModelClass>(jsonStr); // 此处写后续业务逻辑 return Ok(); }
可选进阶:自动模型绑定实现
如果希望通过 [FromForm] 直接绑定到模型,无需手动反序列化,可通过自定义 TypeConverter 实现:
- 定义请求模型和JSON结构模型:
// 完整表单请求模型 public class FormRequestModel { // 对应表单中name为ZZZZZZZZZZ的JSON字段 public YourJsonModel ZZZZZZZZZZ { get; set; } } // JSON对应的业务模型 public class YourJsonModel { // 按实际JSON结构定义属性 public string DemoProperty { get; set; } }
- 给JSON模型添加自定义转换器:
[TypeConverter(typeof(JsonTypeConverter<YourJsonModel>))] public class YourJsonModel { // 模型属性 } // 通用JSON类型转换器 public class JsonTypeConverter<T> : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string jsonStr) { return System.Text.Json.JsonSerializer.Deserialize<T>(jsonStr); } return base.ConvertFrom(context, culture, value); } }
- 接口方法直接绑定模型即可:
[HttpPost] [Route("[action]")] public IActionResult YYYYYYY([FromForm] FormRequestModel request) { // request.ZZZZZZZZZZ 就是已经反序列化完成的对象 return Ok(); }
注意事项
- 不要直接同步读取
Request.Body,不仅容易出错,还会导致请求流被提前消耗,影响后续中间件执行 - 原生
ReadFormAsync已经兼容所有标准 multipart/form-data 格式,包括边界符特殊字符、多字段混合文件+文本等场景
内容的提问来源于stack exchange,提问作者Johna
相关产品推荐
相关产品推荐

