2. Because Apache-SOAP response uses "return" for response tag name, you have to change <message><part>:
<part name='return' type='tns:ArrayOfstring'/>
</message>
3. If you use Apache-SOAP earlier to 2.2, it does not support "http://www.w3.org/2001/XMLSchema", you have to change "xmlns:xsd" in <definitions> as below:
4. In Deployment file, qname for mapping is not "tns:ArrayOfstring", but:
-----Message d'origine-----Hallo all,
De : [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]De la part de Oliver Rettig
Envoy� : mercredi 11 juillet 2001 10:01
� : [EMAIL PROTECTED]
Objet : Re: problems with String[], apache-soap.server->ms-soap-client: type conversion-errorI havn�t solve the problem. Perhaps I need another Deployment-descriptor for invoking with ms-soap-high-level-client. Please have a look on it.
Thanks
Oliver
I�ve written a soap-server with apache-soap and a want to invoke it via
a ms-high-level-soap-client.
Invocation of methods String dummy(String string) works fine but
invocation of String[] dummy1(String[] stringArray) produces an error:
Type conversion failure for element arg0.Please help. I don�t know what to.
best regards
Oliver
Here�s wsdl:
<?xml version="1.0" encoding='UTF-8'?>
<definitions name='urn:KlickBlick'
targetNamespace='urn:KlickBlickOperator'
xmlns:tns='urn:xml-klickblick'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns='http://schemas.xmlsoap.org/wsdl/'><types>
<xsd:schema targetNamespace='urn:xml-klickblick'xmlns:SOAP-ENC='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http:/schemas.xmlsoap.org/wsdl/soap/'
elementFormDefault='qualified'>
<xsd:complexType name='ArrayOfstring'>
<xsd:complexContent>
<xsd:restriction base='SOAP-ENC:Array'>
<xsd:attribute ref="SOAP-ENC:arrayType"
wsdl:arrayType='xsd:string[]'/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
</types><!-- message declns -->
<message name='stringResponse'>
<part name='Result' type='xsd:string'/>
</message>
<message name='stringArrayRequest'>
<part name='arg0' type='tns:ArrayOfstring'/>
</message>
<message name='stringArrayResponse'>
<part name='arg0' type='tns:ArrayOfstring'/>
</message><!-- port type declns -->
<portType name='KlickBlickPortType'>
<operation name='dummy1'>
<input message='stringArrayRequest'/>
<output message='stringArrayResponse'/>
</operation>
<operation name='dummy2'>
<input message='stringArrayRequest'/>
<output message='stringResponse'/>
</operation>
</portType>
<!-- binding declns -->
<binding name='KlickBlickSOAPBinding' type='KlickBlickPortType'>
<soap:binding style='rpc'
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name='dummy1'>
<soap:operation soapAction=''/>
<input>
<soap:body use='encoded'
namespace='urn:KlickBlickOperator'encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded'
namespace='urn:KlickBlickOperator'encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
<operation name='dummy2'>
<soap:operation soapAction=''/>
<input>
<soap:body use='encoded'
namespace='urn:KlickBlickOperator'encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded'
namespace='urn:KlickBlickOperator'encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding><!-- service decln -->
<service name='KlickBlickService'>
<port name='KlickBlickPortType' binding='KlickBlickSOAPBinding'>
<soap:address
location='http://server1.klickblick.de:8080/soap/servlet/rpcrouter'/>
</port>
</service></definitions>
Here�s the deployment-descriptor:
<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
id="urn:KlickBlickOperator">
<isd:provider type="java"
scope="Application"
methods="dummy1 dummy2">
<isd:java class="KlickBlick.Soap.KlickBlickSoapService"
static="false"/>
</isd:provider><isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener>
<isd:mappings>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="urn:xml-klickblick" qname="tns:ArrayOfstring"java2XMLClassName="org.apache.soap.encoding.soapenc.ArraySerializer"
xml2JavaClassName="org.apache.soap.encoding.soapenc.ArraySerializer"/>
</isd:mappings></isd:service>
ms-client-Code:
void CCalcCliRpcCppDlg::Execute_dummyarray()
{
OLECHAR *pMethodName = L"dummy1";if(Connect())
{
HRESULT hr;
DISPID dispid;
DISPPARAMS parms;
VARIANT pRef[1];
VARIANT pArg[1];
VARIANT result;
VARIANT vb;
EXCEPINFO ExceptInfo;
SAFEARRAY * pSA1;
SAFEARRAYBOUND sabound[1];
LONG index;
BSTR data1 = 0;
BSTR data2 = 0;
VARTYPE vtype = VT_BSTR;hr = m_pSoapClient->GetIDsOfNames(IID_NULL,
&pMethodName, 1,
LOCALE_SYSTEM_DEFAULT, &dispid);
if(FAILED(hr))
{
DisplayHResult(_T("Cannot get dispatch id of
dummy
(array) method."),
hr);
return;
}sabound[0].lLbound = 0;
sabound[0].cElements = 2;parms.cArgs = 1;
parms.cNamedArgs = 0;
parms.rgdispidNamedArgs = 0;
parms.rgvarg = pRef;::VariantInit(&vb);
::VariantInit(&pArg[0]);
::VariantInit(&pRef[0]);pSA1 = SafeArrayCreate(vtype,1,sabound);
index = 0;
data1 = ::SysAllocString(L"ABCD");
data2 = ::SysAllocString(L"AA");hr = SafeArrayPutElement(pSA1,&index,data1);
index ++;
hr = SafeArrayPutElement(pSA1,&index,data2);V_ARRAY(&pArg[0]) = pSA1;
V_VT(&pArg[0]) = VT_ARRAY | vtype;V_VT(&pRef[0]) = V_VT(&pArg[0]) | VT_BYREF;
V_ARRAYREF(&pRef[0]) = &pArg[0].parray;::VariantInit(&result);
hr = m_pSoapClient->Invoke(dispid, IID_NULL,
LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &parms, &result, &ExceptInfo, NULL);
if(FAILED(hr))
{
DisplayFault(_T("Invoke of dummy (array) method
failed."));
}
else
{
VariantChangeType(&result, &result, 0, VT_BSTR);m_ResultCtl.SetWindowText(CString(result.bstrVal));
}VariantClear(&result);
if(pSA1 != NULL)
hr = SafeArrayDestroy(pSA1);
}
}
