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