C# 如何处理soap协议中的xml报文

来源:这里教程网 时间:2026-02-21 17:28:57 作者:

C# 处理 SOAP 协议中的 XML 报文,通常用于调用 Web Service 接口。SOAP 是基于 XML 的通信协议,C# 提供了多种方式来处理这些报文,无论是自动封装还是手动解析发送。以下是几种常用方法和关键点说明。

使用 WCF 或添加服务引用自动生成客户端

这是最常见且推荐的方式,适用于标准的 ASMX 或 WCF Web Service。

在 Visual Studio 中右键项目 → “添加” → “连接的服务” 或 “添加服务引用”。 输入 Web Service 的 WSDL 地址(如:https://www.php.cn/link/955fda27a2b8c63b1a738968656ce939?wsdl)。 工具会自动生成代理类,包含方法、数据类型和底层 SOAP 消息封装逻辑。 调用方法时,C# 自动将参数序列化为 SOAP XML 并发送,响应也会反序列化为对象。

例如:

var client = new ServiceReference1.MyServiceClient();
var response = client.GetData(123); // 自动处理 SOAP 封装

手动构造和解析 SOAP XML 报文

当需要精细控制报文内容(如添加 Header、兼容老旧接口),可手动构建 SOAP 请求。

使用 HttpWebRequest 发送原始 SOAP 消息。 准备符合规范的 SOAP Envelope XML 字符串。 设置请求头 Content-Type 为
text/xml; charset=utf-8
,SOAPAction 正确指向目标操作。
通过 Stream 写入 XML,读取响应流并解析返回的 XML。

示例代码片段:

string soapRequest = @"<?xml version='1.0' encoding='utf-8'?>
<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>
  <soap:Body>
    <GetData xmlns='http://tempuri.org/'>
      <id>123</id>
    </GetData>
  </soap:Body>
</soap:Envelope>";
<p>var request = (HttpWebRequest)WebRequest.Create("<a href="https://www.php.cn/link/955fda27a2b8c63b1a738968656ce939">https://www.php.cn/link/955fda27a2b8c63b1a738968656ce939</a>");
request.Method = "POST";
request.ContentType = "text/xml; charset=utf-8";
request.Headers.Add("SOAPAction", "<a href="https://www.php.cn/link/1b159dc50cad7253d6c91bc03c2bf33c">https://www.php.cn/link/1b159dc50cad7253d6c91bc03c2bf33c</a>");</p><p>using (var stream = request.GetRequestStream())
{
byte[] bytes = Encoding.UTF8.GetBytes(soapRequest);
stream.Write(bytes, 0, bytes.Length);
}</p><p>using (var response = (HttpWebResponse)request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
string resultXml = reader.ReadToEnd();
// 使用 XmlDocument 或 XDocument 解析 resultXml
}

使用 XmlDocument 或 XDocument 处理报文内容

在构造或解析 SOAP 响应时,常配合 XML 操作类。

XmlDocument:基于 DOM,适合小到中等大小的报文,支持 XPath 查询。 XDocument(LINQ to XML):更现代,语法简洁,适合构造和查询。 注意命名空间处理,SOAP 和服务定义的命名空间必须正确匹配。

例如提取响应中的某个字段:

XDocument doc = XDocument.Parse(resultXml);
XNamespace ns = "http://tempuri.org/";
var value = doc.Descendants(ns + "GetDataResult").FirstOrDefault()?.Value;

启用消息日志以调试 SOAP 报文

开发过程中若需查看实际发送/接收的 XML,可开启 WCF 跟踪。

在 app.config 或 web.config 中配置 日志会记录完整的 SOAP 请求和响应,便于排查格式或数据问题。

基本上就这些。根据项目需求选择合适方式:大多数情况推荐自动生成客户端;特殊场景再手动处理 XML。关键是理解 SOAP 结构和命名空间的作用。

相关推荐