В приведенном вами примере сообщения показано сообщение с использованием так называемой «кодировки SOAP Раздел 5».SOAP-кодирование (не говоря уже о SOAP) было объявлено устаревшим всеми основными поставщиками инструментов и сервисов довольно давно, из-за проблем с совместимостью и совместимостью.Как в 2004 году или около того.
Серьезно.Никто не должен больше использовать этот материал.Нет оправдания.
Но даже в этом случае, вы должны быть в состоянии заставить его работать.
Задача состоит в том, чтобы правильно получить пространства имен XML для каждого из элементов запроса и ответа.Просто взглянув на пример сообщения с запросом - тот, который «работает» - вы можете увидеть, что он как бы ненормальный.В элементе запроса верхнего уровня есть пространство имен с префиксом STES - Execute
.Затем все дочерние элементы вообще не получают пространства имен.Это странно
То же самое странное включение / выключение пространства имен происходит в массиве Params.Элемент оболочки находится в пространстве имен с префиксом sof
.Но дочерние элементы ключа и значения не находятся в этом пространстве имен - они вообще не находятся в пространстве имен.
В вашей попытке у вас есть пара несовпадений;
Обычно правильный WSDL означает, что вам не нужно беспокоиться ни о чем из этого.Я озадачен тем, почему ваш WSDL не генерирует прокси, который делает правильные вещи.В этом случае я рекомендую людям получить wSDL, который действительно работает.Часто это означает написание фиктивной версии сервиса в ASMX.
Если вы можете создать сервис в ASMX, который принимает сообщения в форме, принятой реальным сервисом, и если вы можете сгенерировать клиент, который взаимодействует с этим сервисом ASMX, то клиент также должен работать с реальным сервисом.,Причина, по которой я рекомендую ASMX, заключается в том, что его легко настроить и повторить.
С этой целью вот что я могу сделать.
<%@ WebService Language="c#"
Class="Cheeso.CooperService"
%>
using System.Web.Services;
using System.Web.Services.Description;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
using System.Collections;
namespace Cheeso
{
[SoapType(Namespace="http://www.smarteam.com/dev/ns/SOF/2.0")]
public class DictionaryItem
{
public string key { get; set; }
public string value { get; set; }
}
[System.Web.Services.WebService
(Name="EngineSoapBinding",
Namespace="http://www.smarteam.com/dev/ns/iplatform/embeddedscripts/wsdl/")]
public class CooperService : System.Web.Services.WebService
{
[WebMethod]
[SoapRpcMethod
("http://www.smarteam.com/dev/ns/iplatform/embeddedscripts/action/Execute",
RequestNamespace="http://www.smarteam.com/dev/ns/iplatform/embeddedscripts",
ResponseNamespace="http://www.smarteam.com/dev/ns/iplatform/embeddedscripts",
Use=SoapBindingUse.Encoded)]
[return: System.Xml.Serialization.SoapElementAttribute("Result")]
public object Execute(string ContextHandle,
string ScriptLanguage,
string Script,
DictionaryItem[] Params)
{
return "The answer is 42. What is the question?";
}
}
}
Этот файл ASMX должен создавать WSDL и интерфейс, эквивалентный вашей реальной службе.Сгенерируйте из него WSDL (используя запрос? Wsdl), а затем напишите тестовый клиент.Изучите сообщения на проводе и настройте при необходимости.
Вы можете видеть, что я применил тип REAL к массиву Params.Также я украсил этот тип атрибутом SoapType
и указал желаемое пространство имен xml.
В заявлении о проблеме вы не описали ответное сообщение.Вам необходимо выполнить аналогичное упражнение - настроить и настроить - чтобы сформировать ответное сообщение, «ожидаемое» вашим клиентом, для соответствия ответам, фактически сгенерированным реальной службой.
Также помните, что префиксы xmlns не имеют значения.Это префикс, который вам нужно сопоставить, это само пространство имен XML.Вам не нужно STES:Execute
.Вы можете использовать любой префикс пространства имен, если он соответствует правильному пространству имен xml.
Удачи.
Если у вас есть возможность, убедите их перейти на службу, совместимую с WS-Iинтерфейс.Взаимодействие намного проще, когда служба соответствует рекомендациям WS-I.
EDIT
Это трассировка фактического сообщения от клиента, сгенерированного с использованием этого WSDL:
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://www.smarteam.com/dev/ns/iplatform/embeddedscripts/wsdl/"
xmlns:types="http://www.smarteam.com/dev/ns/iplatform/embeddedscripts/wsdl/encodedTypes"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<q1:Execute xmlns:q1="http://www.smarteam.com/dev/ns/iplatform/embeddedscripts">
<ContextHandle xsi:type="xsd:string">00913983</ContextHandle>
<ScriptLanguage xsi:type="xsd:string">Canadian, eh?</ScriptLanguage>
<Script xsi:type="xsd:string">To be or not to be....</Script>
<Params href="#id1" />
</q1:Execute>
<soapenc:Array id="id1"
xmlns:q2="http://www.smarteam.com/dev/ns/SOF/2.0"
soapenc:arrayType="q2:DictionaryItem[2]">
<Item href="#id2" />
<Item href="#id3" />
</soapenc:Array>
<q3:DictionaryItem id="id2"
xsi:type="q3:DictionaryItem"
xmlns:q3="http://www.smarteam.com/dev/ns/SOF/2.0">
<key xsi:type="xsd:string">17</key>
<value xsi:type="xsd:string">s9dkjdls</value>
</q3:DictionaryItem>
<q4:DictionaryItem id="id3"
xsi:type="q4:DictionaryItem"
xmlns:q4="http://www.smarteam.com/dev/ns/SOF/2.0">
<key xsi:type="xsd:string">fish</key>
<value xsi:type="xsd:string">barrel</value>
</q4:DictionaryItem>
</soap:Body>
</soap:Envelope>
Даже еслиэто отличается от вашего целевого сообщения, это должно быть для анализа на стороне сервера, если оно соответствует спецификации кодирования SOAP v1.1 раздела 5.В этом сообщении-запросе используется сериализация «множественная ссылка», в то время как в вашем примере целевого сообщения используется «одиночная ссылка».Но они должны быть эквивалентны стороне сервера.Должно быть.
Но, как я уже сказал, было много проблем с обеспечением совместимости кодирования раздела 5 SOAP.