如何用C#类对象向XML接收API发送POST请求?
解决方案:将C#类对象转为符合API要求的HttpContent发送
你的API通过接收上传的XML文件(IFormFile)来反序列化处理对象,因此控制台需要把randFe()生成的FatturaElettronicaType对象序列化为XML,再包装成模拟文件上传的MultipartFormDataContent,才能被API正确接收。
步骤说明
- 使用
XmlSerializer将类对象序列化为XML流 - 将XML流包装为
StreamContent,并设置文件名和内容类型 - 把
StreamContent添加到MultipartFormDataContent中,对应API的upload参数名 - 修正异步调用问题,使用
await处理PostAsync
修改后的控制台代码
// 注意:包含此代码的方法需要标记为async int? posts = null; do { Console.WriteLine("Quanti post?"); // 增加输入校验,避免非数字输入导致异常 if (!int.TryParse(Console.ReadLine(), out int inputPosts)) { Console.WriteLine("输入无效,请输入数字"); continue; } posts = inputPosts; } while (posts == null); // 复用XmlSerializer实例,提升性能 XmlSerializer serializer = new XmlSerializer(typeof(FatturaElettronicaType)); for (int i = 0; i < posts; i++) { // 生成模拟对象 FatturaElettronicaType fe = randFe(); // 将对象序列化为内存流 using MemoryStream xmlStream = new MemoryStream(); serializer.Serialize(xmlStream, fe); xmlStream.Position = 0; // 重置流指针到开头,确保后续能正确读取 // 包装为StreamContent,模拟文件上传 using StreamContent fileContent = new StreamContent(xmlStream); fileContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/xml"); // 构建表单内容,参数名需和API的upload参数一致 using MultipartFormDataContent formContent = new MultipartFormDataContent(); formContent.Add(fileContent, "upload", $"fattura_{i}.xml"); // 自定义文件名 // 异步发送请求并等待响应 using HttpResponseMessage response = await client.PostAsync("api/xml", formContent); // 可选:验证响应状态 response.EnsureSuccessStatusCode(); Console.WriteLine($"第{i+1}条数据发送成功"); }
关键细节说明
- XmlSerializer复用:避免在循环内重复创建实例,减少资源消耗
- 流指针重置:序列化后流指针处于末尾,必须重置到开头才能被正确读取
- 参数名匹配:
formContent.Add的第二个参数必须和API方法的参数名upload完全一致,否则API无法识别上传文件 - 异步处理:原代码未使用
await调用PostAsync,会导致异步操作未完成就进入下一次循环,必须添加await(同时包含代码的方法要标记为async) - 内容类型设置:指定
application/xml确保API能正确识别文件格式
内容的提问来源于stack exchange,提问作者Danny220
相关产品推荐
相关产品推荐

