C#SOAP客户端:发送通用XmlNode请求

时间:2019-03-19 16:58:39

标签: c# xml soap

我有一个C#项目,其中使用集成的Visual Studio功能添加了SOAP服务参考(右键单击->添加->服务参考)

客户端类正确生成,没有错误。但是,服务的各种方法仅接受通用System.Xml.XmlNode作为输入,而不接受结构化对象。

理论上这应该不是问题,因为我拥有需要执行的完整XML文件以及查询。所以我尝试这样做:

NSIStdV20ServiceSoapClient client = new NSIStdV20ServiceSoapClient();
var getAllDataFlowQuery = File.ReadAllText(@"Query\get_all_dataflow.xml"); //file containing the query
XmlDocument doc = new XmlDocument();
doc.LoadXml(getAllDataFlowQuery);
var dataStructures = client.QueryStructure(doc); //this method accepts a System.Xml.XmlNode as parameter

但是,这不起作用,抛出

System.ServiceModel.FaultException: 'Error due to a non correct client message'

我最初以为该查询不正确,但是我尝试使用SoapUI执行完全相同的查询,并且效果很好!我什至尝试使用doc.InnerXml返回的确切XML来做到这一点(只是为了确保che XmlDocument对象没有修改XML),并且它可以正常工作。

所以基本上,只有从C#调用方法时,它才行不通。

如果您想自己尝试一下,可以免费访问该服务,这里是WSDL:

  

http://sdmx.istat.it/SDMXWS/NsiStdV20Service.asmx?WSDL

,您应该尝试使用以下有效负载调用QueryStructure方法:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://ec.europa.eu/eurostat/sri/service/2.0"><soapenv:Header /><soapenv:Body><web:QueryStructure><!--Optional:--><web:Query><RegistryInterface xsi:schemaLocation="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message SDMXMessage.xsd" xmlns="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message" xmlns:common="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/common" xmlns:compact="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/compact" xmlns:cross="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/cross" xmlns:generic="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/generic" xmlns:query="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/query" xmlns:structure="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/structure" xmlns:registry="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/registry" xmlns:utility="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/utility" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Header><ID>JD014</ID><Test>true</Test><Truncated>false</Truncated><Name xml:lang="en">Trans46302</Name><Prepared>2001-03-11T09:30:47-05:00</Prepared><Sender id="BIS" /></Header><QueryStructureRequest resolveReferences="false"><registry:DataflowRef /></QueryStructureRequest></RegistryInterface></web:Query></web:QueryStructure></soapenv:Body></soapenv:Envelope>

就像我说的那样,这在SoapUI中非常有效,但是从C#调用客户端方法时不起作用

1 个答案:

答案 0 :(得分:1)

好吧,似乎Visual Studio生成的客户端(即使它接受XmlNode作为输入)本身也会创建一些所需的外部结构(准确地说:所有带有soapenv和{ {1}}名称空间。

这意味着我必须将输入XML简化为:

web