如何在C#中用HttpClient向ASP.NET Core接口发送含列表的Applicant对象
解决方案
首先明确:目标接口使用[FromBody]接收对象时,ASP.NET Core默认期望请求体为JSON格式,而非multipart/form-data。如果对方接口无特殊配置,用JSON序列化发送是更规范且简单的方式。
方式一:适配[FromBody]的JSON请求(推荐)
直接将整个Applicant对象序列化为JSON字符串,用StringContent作为请求体:
byte[] report1 = new UTF8Encoding(true).GetBytes("This is a test report1"); byte[] report2 = new UTF8Encoding(true).GetBytes("This is a test report2"); var reportObject = new { FirstName = "John", LastName = "Doe", Reports = new[] { new { ReportName = "6 week Report", ReportFile = report1 }, new { ReportName = "12 week Report", ReportFile = report2 } // 多报告示例 } }; var baseUrl = "http://localhost:1111"; // 务必补充http/https协议 var endpoint = "/api/validate-reports"; HttpClient httpClient = new HttpClient(); // 序列化为JSON格式内容 var json = JsonSerializer.Serialize(reportObject); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync($"{baseUrl}{endpoint}", content); if (!response.IsSuccessStatusCode) { throw new Exception($"请求失败: {response.StatusCode}"); } return Results.Ok("报告已处理");
方式二:使用MultipartFormDataContent(需接口支持[FromForm])
如果对方接口实际是用[FromForm]接收(而非[FromBody]),可通过索引命名字段的方式添加列表项,格式为Reports[N].PropertyName:
替换你代码中注释的部分,添加如下代码:
// 遍历Reports列表,按索引逐个添加字段 for (int i = 0; i < reportOjbect.Reports.Length; i++) { var report = reportOjbect.Reports[i]; // 添加ReportName,字段名格式:Reports[index].ReportName content.Add(new StringContent(report.ReportName), $"Reports[{i}].ReportName"); // 添加ReportFile,字段名格式:Reports[index].ReportFile content.Add(new ByteArrayContent(report.ReportFile), $"Reports[{i}].ReportFile", report.ReportName); }
注意事项
- 若目标接口确实是
[FromBody],方式二会导致对象绑定失败,必须使用方式一。 HttpClient实例建议复用,避免频繁创建销毁(可通过依赖注入管理)。- URL必须补充
http://或https://,否则Uri初始化会报错。
内容的提问来源于stack exchange,提问作者abujafar
相关产品推荐
相关产品推荐

