You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET中多内容POST请求发送XML文件的问题排查

问题描述

在.NET应用间发送多内容POST请求时遇到异常:接收XML文档字符串后传递给另一.NET应用解析,对方虽能收到XML,但会将其识别为带首尾引号的字符串,导致XML解析失败。由于现有上传XML文件并传递给该解析应用的逻辑运行正常,因此希望在不修改解析服务的前提下,调整当前服务的传递方式以匹配上传文件的逻辑。

无法正常工作的代码
var fileContent = "<xml stuff></xml stuff>";
var multiContent = new MultipartFormDataContent();
var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(fileContent));
var streamContent = new StreamContent(memoryStream);
streamContent.Headers.Remove("Content-Type");
streamContent.Headers.ContentType = MediaTypeWithQualityHeaderValue.Parse("application/xml");
multiContent.Add(streamContent, "file", "toBeParsed.xml");
multiContent.Add(new StringContent(applicationData, Encoding.UTF8, "application/json"));
return multiContent;
可正常运行的上传文件代码
var multiContent = new MultipartFormDataContent();
var streamContent = new StreamContent(files.First().OpenReadStream());
streamContent.Headers.Remove("Content-Type");
streamContent.Headers.ContentType = MediaTypeWithQualityHeaderValue.Parse("application/xml");
multiContent.Add(streamContent, "file", "toBeParsed.xml");
multiContent.Add(new StringContent(applicationData, Encoding.UTF8, "application/json"));
return multiContent;
修正建议
  • 确保XML字符串无额外引号:检查fileContent的实际内容,确认其是纯XML文本(如<xml stuff></xml stuff>),而非带首尾引号或HTML转义的字符串(如"<xml stuff></xml stuff>"或&lt;xml stuff&gt;&lt;/xml stuff&gt;)。若字符串来自JSON解析等场景,需先去除首尾引号。
  • 使用ByteArrayContent替代StreamContent:直接基于XML字节数组创建内容,避免MemoryStream可能带来的流位置问题,代码示例:
    var fileContent = "<xml stuff></xml stuff>";
    var multiContent = new MultipartFormDataContent();
    // 使用无BOM的UTF8编码,匹配文件上传的编码格式
    var utf8NoBom = new UTF8Encoding(false);
    var byteContent = new ByteArrayContent(utf8NoBom.GetBytes(fileContent));
    byteContent.Headers.Remove("Content-Type");
    byteContent.Headers.ContentType = MediaTypeWithQualityHeaderValue.Parse("application/xml");
    multiContent.Add(byteContent, "file", "toBeParsed.xml");
    multiContent.Add(new StringContent(applicationData, utf8NoBom, "application/json"));
    return multiContent;
    
  • 重置MemoryStream位置(若继续使用StreamContent):创建MemoryStream后需将位置重置到开头,确保StreamContent能读取完整内容:
    var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(fileContent));
    memoryStream.Position = 0; // 重置流起始位置
    var streamContent = new StreamContent(memoryStream);
    
  • 统一使用无BOM的UTF8编码:文件上传的流通常是无BOM的UTF8格式,因此在将字符串转为字节数组时,使用new UTF8Encoding(false)而非默认的Encoding.UTF8(默认可能带BOM),避免解析服务因编码差异识别异常。

内容的提问来源于stack exchange,提问作者user1623990

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:23:19