接受 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的类,如XmlReader
或XmlNode
?
【问题讨论】:
【参考方案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 页面