如何检查SendAsync发送内容并可视化XML,排查服务器解析失败问题
排查SOAP请求解析错误的方案
服务器返回InternalServerError且提示Couldn't parse stream,核心问题是请求的SOAP XML格式不符合服务端要求,以下是具体排查方案:
一、可视化待发送的XML内容
先确认生成的XML本身是否合法:
- 在创建
ByteArrayContent前,直接输出格式化后的XML:// 输出格式化XML到控制台 string formattedXml = doc.ToString(); Console.WriteLine(formattedXml); // 也可写入文件留存 File.WriteAllText("request_soap.xml", formattedXml); - 将输出的XML复制到XML编辑器(如Visual Studio)或本地验证工具,检查是否存在标签未闭合、命名空间错误、特殊字符未转义等语法问题。
二、捕获完整的HTTP请求内容
若XML本身无语法问题,需确认HTTP请求的整体结构(Headers+Content)是否合规:
1. 自定义Handler拦截请求
通过DelegatingHandler捕获并打印完整请求细节:
public class RequestLoggingHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 打印请求Headers Console.WriteLine("=== Request Headers ==="); foreach (var kvp in request.Headers) { Console.WriteLine($"{kvp.Key}: {string.Join(", ", kvp.Value)}"); } // 打印请求Content if (request.Content != null) { string contentStr = await request.Content.ReadAsStringAsync(); Console.WriteLine("\n=== Request Content ==="); Console.WriteLine(contentStr); // 重置Content,避免读取后流被消耗 request.Content = new StringContent(contentStr, Encoding.UTF8, request.Content.Headers.ContentType.MediaType); } return await base.SendAsync(request, cancellationToken); } }
修改HttpClient创建逻辑,引入该Handler:
HttpClient client = new HttpClient(new RequestLoggingHandler(new HttpClientHandler() { Credentials = credentialCache, PreAuthenticate = true }));
2. 验证Content-Type配置
确认SOAP媒体类型和编码是否匹配服务端要求:
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/soap+xml") { CharSet = "utf-8" // 显式指定UTF-8编码,避免编码不一致 };
三、常见排查方向
- 检查SOAP Envelope的命名空间是否与服务端要求完全一致;
- 确认
UsernameToken、Nonce等自定义Headers的格式是否符合服务端身份验证规范; - 验证
doc.ToByteArrayContent()方法是否正确处理了XML编码,避免出现乱码; - 检查XML中是否存在未转义的特殊字符(如
&、<、>)。
内容的提问来源于stack exchange,提问作者Wieslaw
相关产品推荐
相关产品推荐

