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
相关产品推荐
相关产品推荐

