将Curl POST请求转换为C# .NET WebApi调用遇500错误求助
解决Curl转C#/.NET时的API 500错误问题
问题背景
原可正常运行的Curl请求:
curl -X POST http://jasserver:8010/jderest/file/upload --form file="@C:\temp\test.pdf;type=application/pdf" --form moAdd="@C:\temp\upload.json;type=application/json"
Postman生成的C#代码返回500错误(代码如下):
var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "http://webserver.domain.com:8010/jderest/file/upload"); var content = new MultipartFormDataContent(); content.Add(new StreamContent(File.OpenRead(@"C:\temp\test.pdf")), "file", @"C:\temp\test.pdf"); content.Add(new StreamContent(File.OpenRead(@"C:\temp\upload.json")), "moAdd", @"C:\temp\upload.json"); request.Content = content; var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync());
错误原因
原Curl请求中,每个表单字段都明确指定了Content-Type(file对应application/pdf,moAdd对应application/json),但Postman生成的代码未为StreamContent设置该头信息,导致API无法正确解析请求的文件类型,从而返回500错误。
修正后的C#代码
using var client = new HttpClient(); using var pdfStream = File.OpenRead(@"C:\temp\test.pdf"); using var jsonStream = File.OpenRead(@"C:\temp\upload.json"); var request = new HttpRequestMessage(HttpMethod.Post, "http://jasserver:8010/jderest/file/upload"); var content = new MultipartFormDataContent(); // 处理PDF文件,设置正确的Content-Type var pdfContent = new StreamContent(pdfStream); pdfContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf"); content.Add(pdfContent, "file", Path.GetFileName(@"C:\temp\test.pdf")); // 处理JSON文件,设置正确的Content-Type var jsonContent = new StreamContent(jsonStream); jsonContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); content.Add(jsonContent, "moAdd", Path.GetFileName(@"C:\temp\upload.json")); request.Content = content; var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync());
关键修改点
- 为每个
StreamContent手动设置ContentType,完全匹配原Curl中的type参数 - 使用
using语句管理HttpClient和文件流,避免资源泄漏 - 表单字段名(
file、moAdd)与原Curl保持一致 - 仅传递文件名(而非完整路径)作为表单字段的文件名参数,与Curl行为一致
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

