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

.NET 6中HttpClient同时传JSON对象与IFormFile报Unsupported Media Type错误

问题:同时发送DTO对象与IFormFile时触发"Unsupported Media Type"错误

我花了三天时间尝试把名为fileItem的复杂类型DTO序列化后的JSON,和名为file的IFormFile类型数据一起发送给Web API,该API接收FileItem对象与IFormFile对象作为输入,但一直收到“Unsupported Media Type”错误。

注意:单独发送文件,或者单独发送对象(同时修改API端点只接收其中一种类型)都能正常运行,但同时发送两者就会触发错误。

ASP.NET MVC客户端代码

public async Task<string> SaveFiles(FileItem _fileItem2, IFormFile _file)
{
    using (var multipartFormContent = new MultipartFormDataContent())
    {
        var fileItem = new StringContent(
        JsonSerializer.Serialize(_fileItem2), Encoding.UTF8, Application.Json);
        multipartFormContent.Add(fileItem, "fileItem");

        // 添加文件
        var fileStreamContent = new StreamContent(_file.OpenReadStream());
        fileStreamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(_file.ContentType);
        multipartFormContent.Add(fileStreamContent, name: "file", _file.FileName);

        // 方式1:返回Unsupported media type,移除文件则正常
        var response = await httpClient.PostAsync("/Upload/SaveFileWithData", multipartFormContent);

        // 方式2:同样返回Unsupported media type,移除文件则正常
        var request = new HttpRequestMessage(HttpMethod.Post, "/Upload/SaveFileWithData");
        request.Content = multipartFormContent;
        var responsemsg = await httpClient.SendAsync(request);

        responsemsg.EnsureSuccessStatusCode();

        return await responsemsg.Content.ReadAsStringAsync();
    }
}

.NET 6.0 Web API代码

[HttpPost()]
[Route("SaveFileWithData")]
public async Task<string> SaveFileWithData(FileItem? fileItem, IFormFile? file)
{
    int i = 2;
    return "fileSavedSuccessfully";
}

解决方向

1. 为API参数添加[FromForm]特性

ASP.NET Core默认不会自动从multipart/form-data请求中绑定复杂类型DTO,必须显式指定参数来源。修改API方法:

[HttpPost()]
[Route("SaveFileWithData")]
public async Task<string> SaveFileWithData([FromForm] FileItem? fileItem, [FromForm] IFormFile? file)
{
    int i = 2;
    return "fileSavedSuccessfully";
}

2. 调整客户端DTO的表单提交格式

当前客户端将DTO序列化为JSON字符串提交,但[FromForm]默认期望表单字段为键值对格式,而非JSON字符串,可二选一处理:

  • 拆分DTO属性为独立表单字段
    把FileItem的每个属性单独作为表单字段添加,示例:
    multipartFormContent.Add(new StringContent(_fileItem2.Id.ToString()), "fileItem.Id");
    multipartFormContent.Add(new StringContent(_fileItem2.Name), "fileItem.Name");
    // 其他属性依次添加
    
  • 保持JSON字符串,API手动反序列化
    API端将fileItem参数改为string类型,接收后手动反序列化:
    [HttpPost()]
    [Route("SaveFileWithData")]
    public async Task<string> SaveFileWithData([FromForm] string? fileItemJson, [FromForm] IFormFile? file)
    {
        var fileItem = JsonSerializer.Deserialize<FileItem>(fileItemJson);
        // 后续业务逻辑
        return "fileSavedSuccessfully";
    }
    
    同时客户端调整字段名:
    multipartFormContent.Add(fileItem, "fileItemJson");
    

3. 确认请求内容类型

客户端的MultipartFormDataContent默认会设置正确的multipart/form-data内容类型,无需额外修改,确保代码中没有意外覆盖该设置即可。


内容的提问来源于stack exchange,提问作者Raz Muhammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:54:24