У меня есть проект C #, в который я добавил ссылку на службу SOAP, используя встроенную функциональность Visual Studio (щелкните правой кнопкой мыши -> Добавить -> ссылка на службу)
Классы клиента генерируются правильно, без ошибок.Однако различные методы службы принимают в качестве входных данных только общий 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
, и он работает отлично!Я даже попытался сделать это с точным XML, возвращаемым doc.InnerXml
(просто чтобы убедиться, что объект 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 #