接受 SOAP 数据作为原始 XML

Posted

技术标签:

【中文标题】接受 SOAP 数据作为原始 XML【英文标题】:Accepting SOAP data as raw XML 【发布时间】:2021-06-16 03:00:42 【问题描述】:

我正在尝试使用 System.ServiceModel 命名空间编写一个 .NET IIS Web 服务。我的服务应将传入数据包中的 startTag 节点作为 RAW XML 而不是反序列化的 .NET 类读取,但我似乎做不到。这是一个示例 SOAP 数据包:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:tmk="http://schemas.datacontract.org/2004/07/TMK.Catalog">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:Catalog>
         <tem:document>
            <tmk:CHRMAS03>
                 <startTag>
                <myTag>
                    <answer>Hello world!</answer>
                </myTag>
            </startTag>
            </tmk:CHRMAS03>
         </tem:document>
      </tem:Catalog>
   </soapenv:Body>
</soapenv:Envelope>

这是我的网络服务:

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Xml.XPath;

[ServiceContract]
public interface IContract

    [OperationContract]
    string Catalog(Point document);


[DataContract]
public class Point

    [DataMember]
    public XPathDocument CHRMAS03;

    public Point (XPathDocument document)
    
        this.CHRMAS03= document;
    

public class Service1 : IContract

    public string Catalog (Point document)
    
        if(document.CHRMAS03!=null) 
        
        try
        
            XPathNavigator navigator = document.CHRMAS03.CreateNavigator();
            XPathNodeIterator iterator1 =  navigator.Select("startTag/myTag/answer");
            if(iterator1==null) return "crash"; 
            int a = iterator1.Count; // Exception!
            return "success"; 
        
            catch(Exception e)
            
                return e.Message + e.StackTrace;
            
        
        return "fail";
    

当我将上面指定的数据包发送到我的网络服务时,这一行:

int a = iterator1.Count

抛出异常:

   Object reference not set to an instance of an object.
   at MS.Internal.Xml.Cache.XPathDocumentNavigator.get_NameTable()
   at MS.Internal.Xml.Cache.XPathDocumentElementChildIterator..ctor(XPathDocumentNavigator parent, String name, String namespaceURI)
   at MS.Internal.Xml.Cache.XPathDocumentNavigator.SelectChildren(String name, String namespaceURI)
   at MS.Internal.Xml.XPath.ChildrenQuery.Advance()
   at MS.Internal.Xml.XPath.ChildrenQuery.Advance()
   at MS.Internal.Xml.XPath.ChildrenQuery.Advance()
   at MS.Internal.Xml.XPath.Query.MoveNext()
   at MS.Internal.Xml.XPath.Query.get_Count()
   at TMK.Catalog.Service1.Catalog(Point document)

我应该如何重新定义CHRMAS03 字段,以便将startTag 节点的原始XML 内容作为我可以手动解析的字符串或任何标准.NET 的工作实例 em> 读取XML的类,如XmlReaderXmlNode?

【问题讨论】:

【参考方案1】:

“startTeg/myTeg/answer”应该是“startTag/myTag/answer”?

【讨论】:

谢谢。这只是在编辑问题时引入的一个错字。我已经修好了。【参考方案2】:

我的XPath查询:

startTag/myTag/answer

没有工作,因为 XML 是用标签之间的空白元素解析的。我切换到XMLDocument 并修改了我的代码以跳过它们:

XmlNode root = doc.DocumentElement;
foreach (XmlNode idoc in root.ChildNodes)

    if (idoc.Name == "#whitespace") continue;
    /* ... processing ... */

我认为这个空白元素导致XPathNodeIterator.Count 抛出。

【讨论】:

以上是关于接受 SOAP 数据作为原始 XML的主要内容,如果未能解决你的问题,请参考以下文章

从 ASP.NET SOAP 服务检索 XML 数据到 ASP.NET aspx 页面

在PHP中解析XML SOAP响应

如何将xml doc作为字节数组发送到soap服务?

使用没有 Soap Envelope 的 XSD 验证 XML 数据

如何使用正则表达式处理来自SOAP XML的数据

Powershell SOAP 更新正文部分并重新请求