.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>"或<xml stuff></xml stuff>)。若字符串来自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
相关产品推荐
相关产品推荐

