Клиент C # SOAP: отправка общего запроса XmlNode - PullRequest
0 голосов
/ 19 марта 2019

У меня есть проект 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 #

1 Ответ

1 голос
/ 25 марта 2019

Что ж, похоже, что клиент, сгенерированный Visual Studio, даже если он принимает XmlNode в качестве входных данных, сам создает некоторую необходимую внешнюю структуру (если быть точным: все внешние узлы с soapenv и web Пространства имен).

Это означает, что мне пришлось сократить входной XML до:

<?xml version="1.0" encoding="UTF-8"?><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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...