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

ASP.NET Core 2.0中HttpWebRequest多文件上传转HttpClient遇400错误求助

解决HttpClient上传文件到第三方API的400错误问题

结合你提供的原HttpWebRequest代码和当前的HttpClient实现,我发现两个核心问题导致了400错误,下面给你梳理修复方案:

1. 表单字段名大小写不匹配

原代码中文件对应的表单字段名是**multipartFile(注意大写的F),但你用HttpClient编写的代码里写成了multipartfile**(小写f)。第三方API大概率是严格匹配字段名的,这直接导致API无法识别你上传的文件,返回"Please select a file to upload"错误。

2. 多余的换行符和无效字符

你在StringContent中手动添加了\r\n和额外引号,这完全没必要——MultipartFormDataContent会自动处理multipart请求的格式分隔符,手动添加这些字符会导致字段值带上无效的换行,干扰API解析逻辑。

修正后的完整代码

// 修正拼写错误:boundryText → boundaryText
var boundaryText = "ACI-XFER";
using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("https://localhost:44636");
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
    string relativeUrl = "api/uploads";
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, relativeUrl);
    
    // Basic认证部分保持不变
    var byteArray = new UTF8Encoding().GetBytes("APIUser:APIUserPassword");
    request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
    
    using (var content = new MultipartFormDataContent(boundaryText))
    {
        // 去掉手动添加的\r\n,直接传入纯字段值
        content.Add(new StringContent(uploadFileRequestDto.FileName), "filename");
        content.Add(new StringContent(uploadFileRequestDto.PdxEnvironment), "environment");
        
        // 修正字段名为multipartFile(大写F),去掉多余的引号和换行
        Encoding encNoBoM = new UTF8Encoding(false);
        content.Add(
            new StringContent(uploadFileRequestDto.TextFile, encNoBoM, "text/plain"), 
            "multipartFile",  // 这里是关键修正!
            uploadFileRequestDto.FileName
        );
        
        request.Content = content;
        var response = await client.SendAsync(request);
        
        if (response.IsSuccessStatusCode)
        {
            string jsonResult = await response.Content.ReadAsStringAsync(); // 改用await,避免.Result阻塞
            uploadFileResponseDto = JsonConvert.DeserializeObject<UploadFileResponseDto>(jsonResult); // 显式指定反序列化类型
            uploadFileResponseDto.Success = true;
            uploadFileResponseDto.StatusCode = 200;
            return uploadFileResponseDto;
        }
        else
        {
            _logger.LogError("File upload for Id [{ID}] failed. Reason: {ReasonPhrase}", uploadFileRequestDto.Id, response.ReasonPhrase);
            uploadFileResponseDto.Success = false;
            uploadFileResponseDto.Reason = $"Status Code: [{response.StatusCode}], Reason: [{response.ReasonPhrase}]";
            uploadFileResponseDto.StatusCode = 500;
            return uploadFileResponseDto;
        }
    }
}

额外优化建议

  • 用await替代.Result:避免同步阻塞导致的死锁风险,这在ASP.NET Core环境下尤为重要。
  • 显式指定反序列化类型:让代码更清晰,也能避免隐式类型转换的潜在问题。
  • 修正变量名拼写:把boundryText改成boundaryText,保持代码的规范性和可读性。

修复后再用Fiddler捕获请求,你会看到multipartFile字段名正确,且所有字段值都没有多余的换行,应该就能正常通过第三方API的校验了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:52:14