You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文件上传接口调用报错:UnsupportedMediaType及栈溢出问题排查

问题分析与解决方案

核心问题原因

  1. API接口设计冲突:ASP.NET Core不允许同一个Action同时使用[FromBody]和[FromForm]属性。[FromBody]用于绑定application/json格式的请求体,[FromForm]用于处理multipart/form-data表单数据,一个请求只能有一种Content-Type,同时使用会导致模型绑定逻辑混乱,甚至触发栈溢出。
  2. RestSharp调用格式错误:你同时使用AddJsonBody(会自动设置Content-Type为application/json)和AddFile,又手动强行设置Content-Type为multipart/form-data,导致请求内容格式混乱,服务器无法识别,抛出UnsupportedMediaType异常。另外手动设置Content-Type会破坏RestSharp自动生成的multipart边界标识,进一步加剧解析失败。

修复方案

第一步:修正ASP.NET Core API接口

推荐使用统一的表单绑定方式,创建包含请求数据和文件的视图模型:

// 新建视图模型,包含业务请求数据和文件
public class AttachmentCreateModel
{
    public MyRequest RequestData { get; set; }
    public IFormFile UploadFile { get; set; }
}

// 修正后的Action
[HttpPut("Create")]
public async Task<ActionResult<MyResult>> CreateAttachment([FromForm] AttachmentCreateModel model)
{
    // 直接使用 model.RequestData 和 model.UploadFile 处理业务逻辑
    return Ok(new MyResult());
}

如果不想新建视图模型,也可以将JSON数据作为表单的字符串字段传递,手动反序列化:

[HttpPut("Create")]
public async Task<ActionResult<MyResult>> CreateAttachment([FromForm] string requestJson, [FromForm] IFormFile file)
{
    var request = JsonSerializer.Deserialize<MyRequest>(requestJson);
    if (request == null) return BadRequest("请求数据格式错误");
    // 业务处理逻辑...
    return Ok(new MyResult());
}

第二步:修正RestSharp调用代码

对应视图模型方案,RestSharp需要将业务请求数据序列化为JSON字符串,作为表单字段传递,同时添加文件:

// 使用Newtonsoft.Json序列化请求数据(或System.Text.Json)
var requestJson = JsonConvert.SerializeObject(request);

var restRequest = new RestRequest($"{Resource}/Create", Method.Put)
    // 添加业务请求数据作为表单字段
    .AddParameter("RequestData", requestJson, ParameterType.GetOrPost)
    // 添加文件
    .AddFile("UploadFile", fileData, request.FileName);

// 无需手动设置Content-Type,RestSharp会自动处理为multipart/form-data
var result = Client.Put<MyResult>(restRequest)!;

如果用的是第二种API方案(直接接收JSON字符串),只需要把参数名改成requestJson即可:

.AddParameter("requestJson", requestJson, ParameterType.GetOrPost)

额外注意事项

  • 检查MyRequest类是否存在循环引用,这是导致调试时栈溢出的常见原因,确保类结构可以正常序列化/反序列化。
  • 不要手动设置multipart/form-data的Content-Type,RestSharp在调用AddFile时会自动生成正确的请求头(包含边界标识),手动设置会覆盖这些关键信息。

内容的提问来源于stack exchange,提问作者Matthew Wherry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:51:29