У меня есть проект С#, в котором я добавил ссылку на службу 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, и он отлично работает! Я даже пытался сделать это с точным XML, возвращаемым doc.InnerXml (просто чтобы убедиться, что объект XmlDocument не изменяет XML), и это работает.
Так что в основном только при вызове метода из С# он не работает.
Если вы хотите попробовать это сами, сервис находится в свободном доступе, 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#.
@dbc: да, но проблема была не в этом, см. мой ответ ниже.





Ну, похоже, что клиент, созданный 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>
Пробовали
client.QueryStructure(doc.DocumentElement)?