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

如何检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:42:36