.NET Standard 2.0向.NET 4.5.1 API发送XmlDocument的接收方案求助
可行解决方案
方案1:直接发送XML作为请求主体(推荐)
跳过Multipart封装,直接把XML流作为POST请求的主体发送,接收端读取请求流解析,实现简单且高效。
发送端(.NET Standard 2.0)代码
// 确保XML流的位置在起始处 options.XmlStream.Seek(0, SeekOrigin.Begin); var streamContent = new StreamContent(options.XmlStream); // 设置正确的Content-Type streamContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/xml"); var httpClient = new HttpClient(); var response = await httpClient.PostAsync("你的API地址", streamContent); response.EnsureSuccessStatusCode();
接收端(.NET Framework 4.5.1 Web API)代码
using System.IO; using System.Xml; using System.Web.Http; public class XmlController : ApiController { [HttpPost] public IHttpActionResult ReceiveXml() { XmlDocument xmlDoc = new XmlDocument(); // 直接读取请求输入流 using (StreamReader reader = new StreamReader(Request.Content.ReadAsStreamAsync().Result)) { string xmlContent = reader.ReadToEnd(); xmlDoc.LoadXml(xmlContent); } // 在这里处理XmlDocument逻辑 return Ok(); } }
方案2:保留MultipartFormDataContent,接收端用传统方式解析
如果必须用Multipart格式,接收端可以借助MultipartFormDataStreamProvider解析上传的文件,无需依赖IFormFile。
发送端代码(保持原有逻辑,注意修正流位置)
options.XmlStream.Seek(0, SeekOrigin.Begin); var multipartContent = new MultipartFormDataContent { { new StreamContent(options.XmlStream), "xmlFile", "request.xml" } }; var httpClient = new HttpClient(); var response = await httpClient.PostAsync("你的API地址", multipartContent); response.EnsureSuccessStatusCode();
接收端(.NET Framework 4.5.1 Web API)代码
using System.IO; using System.Xml; using System.Web.Http; using System.Net.Http; public class XmlController : ApiController { [HttpPost] public async System.Threading.Tasks.Task<IHttpActionResult> ReceiveMultipartXml() { if (!Request.Content.IsMimeMultipartContent()) { return BadRequest("请求不是Multipart格式"); } // 使用临时目录存储上传的文件 var tempDir = Path.GetTempPath(); var provider = new MultipartFormDataStreamProvider(tempDir); await Request.Content.ReadAsMultipartAsync(provider); // 找到名为xmlFile的上传项 var fileData = provider.FileData.FirstOrDefault(f => f.Headers.ContentDisposition.Name.Equals("\"xmlFile\"", System.StringComparison.OrdinalIgnoreCase)); if (fileData == null) { return BadRequest("未找到xmlFile参数"); } XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileData.LocalFileName); // 处理XmlDocument逻辑 // 清理临时文件 File.Delete(fileData.LocalFileName); return Ok(); } }
关键注意事项
- 发送前务必将XML流的Position重置到起始位置,否则接收端会读取到空内容。
- 接收端如果是ASP.NET MVC控制器(而非Web API),可以直接使用
HttpPostedFileBase作为方法参数来接收文件流,逻辑更简单:[HttpPost] public ActionResult ReceiveXml(HttpPostedFileBase xmlFile) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlFile.InputStream); // 处理逻辑 return View(); }
内容的提问来源于stack exchange,提问作者DValdir Martins
相关产品推荐
相关产品推荐

