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

使用C# .NET Framework调用文件上传API时持续返回400 BadRequest求助

问题分析与解决方案

错误原因

后端报错TypeError: Cannot read properties of undefined (reading 'filename'),说明后端无法从请求中识别到上传文件的filename属性,核心问题出在C#代码的请求构造上——要么是表单字段名与API要求不匹配,要么是Content-Disposition头格式不符合后端解析规则。Swagger/Postman能正常请求,说明API本身无问题。

关键修复点

1. 严格匹配API的表单字段名

先确认Swagger或Postman中上传文件的参数名(比如Swagger里的parameter name),代码里的表单字段名必须和这个参数名完全一致。例如:

  • 如果Swagger定义的参数名是file,就把代码中字段名改成"file";
  • 如果是audio,则保持"audio",但必须确保前后端完全一致。

2. 显式设置标准的Content-Disposition头

部分后端框架(如Node.js的multer)要求Content-Disposition头里的name和filename必须包含双引号,否则无法正确解析文件信息,这是常见的遗漏点。

3. 用StreamContent优化上传逻辑

相比ByteArrayContent,StreamContent无需一次性将文件读入内存,更适合大文件,同时头信息处理更符合HTTP标准。

修改后的代码示例

string url = "api endpoint";                    // API基础地址(如https://example.com/api)
string filePath = "C:\\test.wav";               // 音频文件路径
string token = "token";                         // 认证Token
string requestUri = "正确的接口相对路径";        // 如"/transcribe",需与Swagger定义一致

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(url);
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

    using (var form = new MultipartFormDataContent())
    {
        using (var fileStream = File.OpenRead(filePath))
        {
            var fileContent = new StreamContent(fileStream);
            // 设置文件MIME类型
            fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("audio/wav");
            // 显式设置Content-Disposition头,确保后端识别字段名和文件名
            fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                Name = "\"audio\"",  // 替换为API要求的参数名,注意双引号
                FileName = "\"" + Path.GetFileName(filePath) + "\""
            };

            form.Add(fileContent);

            var response = await client.PostAsync(requestUri, form);

            if (response.IsSuccessStatusCode)
            {
                var responseBody = await response.Content.ReadAsStringAsync();
                Console.WriteLine("Success: " + responseBody);
            }
            else
            {
                Console.WriteLine("Error: " + response.StatusCode);
                var errorContent = await response.Content.ReadAsStringAsync();
                Console.WriteLine("Error Details: " + errorContent);
            }
        }
    }
}

额外排查步骤

  1. 对比Postman生成的代码:在Postman完成成功请求后,点击「Code」按钮选择「C# - HttpClient」生成代码,和自己的代码逐行对比,重点看表单字段名、头信息、请求路径的差异。
  2. 验证requestUri正确性:确保requestUri是相对路径(如果BaseAddress已包含域名和基础路径),避免重复拼接导致路径错误。
  3. 检查文件完整性:确认本地test.wav文件未损坏,和Swagger/Postman测试用的文件一致。

内容的提问来源于stack exchange,提问作者黃子睿

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:57:32