如何从控制台应用向C# API发送文件?遭400必填字段错误
问题原因及解决方案
核心问题:表单字段名称不匹配
你的API接口接收的IFormFile参数名为request,但客户端上传时指定的表单字段名是"file",ASP.NET Core的模型绑定会严格根据字段名称匹配参数,因此无法找到对应值,导致request为null,触发必填字段的400错误。
具体修复步骤
1. 修正客户端表单字段名称
将客户端代码中content.Add的第二个参数从"file"改为"request",与API的参数名保持一致:
// 原代码 content.Add(new StreamContent(fileStream), "file", fileName); // 修改后 content.Add(new StreamContent(fileStream), "request", fileName);
2. 优化HttpClient使用(推荐)
不要在循环内重复创建HttpClient,频繁创建会耗尽HTTP连接池,建议在循环外创建一次并复用,同时用using包裹文件流确保资源正确释放:
async Task<List<HttpResponseMessage>> PostFile() { List<HttpResponseMessage> results = new List<HttpResponseMessage>(); using (var httpClient = new HttpClient()) { foreach (string file in Directory.EnumerateFiles("Fatture\\", "*.xml")) { using (var content = new MultipartFormDataContent()) { var fileName = Path.GetFileName(file); using (var fileStream = File.Open(file, FileMode.Open)) { content.Add(new StreamContent(fileStream), "request", fileName); var request = new HttpRequestMessage(HttpMethod.Post, url) { Content = content }; var result = await httpClient.SendAsync(request); results.Add(result); } } } } return results; }
3. 显式指定API参数绑定来源(可选)
在API的IFormFile参数上添加[FromForm]特性,明确告知框架从表单中绑定参数,避免潜在的绑定歧义:
[HttpPost("postFile")] public IActionResult PostFile([FromForm] IFormFile request, CancellationToken requestAborted) { // 原有业务逻辑不变 }
完成以上修改后,客户端上传的文件就能正确匹配API的参数,400错误即可解决。
内容的提问来源于stack exchange,提问作者Danny220
相关产品推荐
相关产品推荐

