【问题标题】:removing/extracting soap header and body from soap message从肥皂消息中删除/提取肥皂标题和正文
【发布时间】:2013-11-28 15:55:21
【问题描述】:

我有如下所示的肥皂消息。我只想获取请求元素及其子节点。

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
               xmlns:xlink="http://www.w3.org/1999/xlink" 
               xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://location.xsd">
  <soap:Header xmlns="http://www.server.net/schema/request.xsd">
  </soap:Header>
  <soap:Body>
   <Request ReqRespVersion="large" Version="1" EchoToken="1.0" xmlns="http://mynamespace.com">
     .....
   </Request>
 </soap:Body>
</soap:Envelope>

我可以使用此代码获取它。

Dim myXDocument As XDocument = XDocument.Load(New StringReader(Request))
Dim Xns As XNamespace = XNamespace.Get("http://mynamespace.com")
SoapBody = myXDocument.Descendants(Xns + "Request").First().ToString

但我不想使用像“请求”这样的特定名称,因为我有多个肥皂消息,并且每个消息都有不同的 xml 元素名称。所以我需要一个通用函数,而不是为每个函数创建一个特定函数。

我遵循了这个建议:Extract SOAP body from a SOAP message

但是使用下面的这段代码,但它对我不起作用。我在哪里做错了,或者我如何在身体部位提取?

Dim myXDocument As XDocument = XDocument.Load(New StringReader(Request))
Dim Xns As XNamespace = XNamespace.Get("soap="http://www.w3.org/2003/05/soap-envelope")
SoapBody = myXDocument.Descendants(Xns + "Body").First().ToString

【问题讨论】:

  • 您手动执行此操作是否有原因?您没有编写 WCF 服务或客户端的原因是什么?
  • @john:确实我的服务是 wcf 并且我已经发布了获取对象和返回对象的操作。我的客户告诉我他想发送字符串,这个字符串周围有肥皂信封,包括标题和正文作为我的例子。对我来说,为了再次将其反序列化为对象,我只需要提取请求部分。确实,我是 wcf 的新手,但我认为 wcf 会自动添加肥皂信封,不是吗?当我与提琴手核对时,我可以看到请求已经和我的示例一样,我不知道我是否应该告诉我的客户他们不需要发送肥皂标签。我对 wcf 的理解正确吗?
  • 很明显,您和您的客户没有进行交流。是的,你当然应该告诉你的客户!

标签: xml vb.net linq-to-xml


【解决方案1】:

您在第二个示例中使用了错误的命名空间,并且您没有遵循链接答案中的完整示例。

XNamespace.Get("soap="http://www.w3.org/2003/05/soap-envelope")

传递给XNamespace.Get的参数应该只是URI:

XNamespace.Get("http://www.w3.org/2003/05/soap-envelope")

那么您的第二个示例将返回如下内容:

<soap:Body xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <Request ReqRespVersion="large" Version="1" EchoToken="1.0" xmlns="http://mynamespace.com">
  </Request>
</soap:Body>

如果您只想要Body 的子元素,那么您需要像这样添加FirstNode

SoapBody = myXDocument.Descendants(Xns + "Body").First().FirstNode.ToString()

这会给你这个:

<Request ReqRespVersion="large" Version="1" EchoToken="1.0" xmlns="http://mynamespace.com">
</Request>

【讨论】:

  • 感谢您纠正我有关命名空间错误的问题,但有一件事我无法发现 firstnode() 在 vb.net 中对我不可用。只有c#吗?
  • @batmaci - 试试FirstNode(没有())。 FirstNode 是属性,而不是方法。
猜你喜欢
  • 2012-07-17
  • 2011-11-20
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多