Здрасьте,
У меня тут такой ляп с SOAP header параметрами в Аксисе. Вот пример метод, который описан в wsdd
<operation name="logoff" qname="operNS:logoff"
xmlns:operNS="
urn:mycompany"
xmlns:xsd="
http://www.w3.org/2001/XMLSchema"><
http://www.w3.org/2001/XMLSchema>
soapAction="" >
<parameter qname="sessionHeader" type="tns:SessionHeader"
xmlns:tns="
urn:mycompany" inHeader="true"/>
</operation>
<operation name="queryEO" qname="operNS:queryEO"
xmlns:operNS="
urn:mycompany" returnQName="queryEOReturn"
returnType="rtns:ArrayOfEnterpriseObject" xmlns:rtns="
urn:mycompany"
returnItemType="tns2:EnterpriseObject" xmlns:tns2="
urn:mycompany" soapAction=""
>
<parameter qname="qlExpression" type="tns:string" xmlns:tns="
http://www.w3.org/2001/XMLSchema"/ ><
http://www.w3.org/2001/XMLSchema>>
<parameter qname="Definition_ID" type="tns:long" xmlns:tns="
http://www.w3.org/2001/XMLSchema"/ ><
http://www.w3.org/2001/XMLSchema>>
<parameter qname="sessionHeader" type="tns:SessionHeader"
xmlns:tns="
urn:mycompany" inHeader="true"/>
</operation>
Как можно увидеть оба метода используют один и тотже параметр, то есть мне бы этого очень хотелось, но в итоге получается, что они используют совершенно разные параметры. То есть когда аксис посылает SOAP пакет для этих параметров используются совершенно разные namaspace. Вот пару глюков, которые обнаружены:
1) В wsdl эти параметры присутствуют как elements sessionHeader,
sessionHeader1. Поэтому на клиенте я должен указать явно, что надо положить эти два параметра в header
binding.setHeader(locator.getServiceName().getNamespaceURI(),
"sessionHeader", new SessionHeader(sessionHeaderObject));
binding.setHeader(locator.getServiceName().getNamespaceURI(),
"sessionHeader1", new SessionHeader(sessionHeaderObject));
Итак я имею дублирование параметров. А надо мне добиться того, чтобы клиент только делал вот такие действия:
binding.setHeader(locator.getServiceName().getNamespaceURI(),
"sessionHeader", new SessionHeader(sessionHeaderObject));
Может я что-то упустил в описании wsdd или необходимо сделать некие манипуляции с axis?
2) Второй глюк — это то, что обо метода по-разному генеряться на клиенте, то есть они имеют разные прототипы для .NET, Java-Axisple
//java code
void logoff(String sessionId); // sessionId parameter is optinal
// how it declare in wsdd
<operation name="logoff" qname="operNS:logoff"
xmlns:operNS="
urn:mycompany"
xmlns:xsd="
http://www.w3.org/2001/XMLSchema"><
http://www.w3.org/2001/XMLSchema>
soapAction="" >
<parameter qname="sessionHeader" type="tns:SessionHeader"
xmlns:tns="
urn:mycompany" inHeader="true"/>
</operation>
Но для NET у меня совершенно другой прототип:
void logoff();
Может что-то надо настроить чтобы все было одинаково и в Джаве и в .NET? Просто я работал с Salesforce — там выполнен аналогичный подход с SOAP header параметрами и нет такого различия в прототипах методов.
--
Thanks for any your help,
Yura.