Re: Another .Net issue
| From: | Dmitri | Date: | Thu, 24 Apr 2003 00:30:42 +0000 |
| Subject: | Re: Another .Net issue | ||
| References: | 1 | Groups: | php.soap |
| Request: | Send a blank email to php-soap+get-567@lists.php.net to get a copy of this message | ||
Hi, Rob
it seems like You have not defined the return type of your soap-method ...
Normaly, PEAR::SOAP returns structure like this:
<return xsi:type="ns4:RETURN_TYPE">
<CUSTOM_TYPE xsi:type="SOAP-ENC:Array"
SOAP-ENC:arrayType="nsX:OTHER_CUSTOM_TYPE[2]" SOAP-ENC:offset="[0]">
<item xsi:type="nsX:OTHER_CUSTOM_TYPE"> .... </item>
<item xsi:type="nsX:OTHER_CUSTOM_TYPE"> .... </item>
</ARRAYTYPE>
</return>
to understand the type definition for Disco.php please look at example
'disco_server.php':
method 'GetMP3Tracks()' returns custom type "GetMP3TracksResult" contains
two father custom types:
"MethodDebug" and "MP3Tracks", where "MP3Tracks" is an array of
farther
custom type called
"MP3TracksArray" and so on and so on ... Every of this custom types must be
defined...
So if you want your method returns an array of your custom types (in this
case it would be type called "Struct"), define at first
the custom type "Struct":
$this->__typedef['Struct'] =
array(
'varString' => 'string',
'varInt' => 'integer',
'varFloat' => 'float'
);
than type "ArrayOfStruct"
$this->__typedef['ArrayOfStruct'] =
array(
array(
'item' => '{urn:YOURNAMESPACE}Struct'
)
);
and than the return type of your method - something like
"MEHTODNAME_Result":
$this->__typedef['MEHTODNAME_Result'] =
array(
'Structs' => '{urn:YOURNAMESPACE}ArrayOfStruct'
);
so now you can implement method, some kind of this:
....
function MEHTODNAME () {
for($i = 0; $i < 5; $i++) {
$this->Structs[$i] = new SOAP_Value(
'item',
'{urn:YOURNAMESPACE}Struct',
array(
"varString" => new
SOAP_Value("varString","string","me varString, yo"),
"varInt" => new
SOAP_Value("varInt","int",(integer)1000000),
"varFloat" => new
SOAP_Value("varFloat","float",1.5)
)
);
}
return new SOAP_Value(
'return',
'{urn:YOURNAMESPACE}MEHTODNAME_Result',
array(
"ArrayOfStruct" => new SOAP_Value('ArrayOfStruct',
'{urn:YOURNAMESPACE}ArrayOfStruct', $this->Structs)
)
);
}
Hope it helps....
P.S. Thanks for recognizing bug in soap:binding transport - hope Shane
will fix it asap :)
"Rob Booth" <rbooth@indyme.com> schrieb im Newsbeitrag
news:20030423215511.97137.qmail@pb1.pair.com...
> I know, why .Net? Well it wasn't my decision to make. Anyway the problem
> that I'm running into is this:
>
> I have PEAR::SOAP running as my server and I'm trying to communicate with
C#
> as my client. I've made some changes to allow C# to automatically
generate
> it's proxy code and can connect to my server and interact as long as I'm
> only dealing with simple data types and basic structures of simple data
> types. However when I try to return an array I get this error:
>
> The specified type was not recognized: name='Struct', namespace='', at
> <return xmlns=''>.
>
> I've looked at what gets returned by my server and this is the structure:
>
> <result xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="Struct[4]"
> SOAP-ENC:offset="[0]">
>
> In trying to solve this I looked at what the Google search service
returns,
> since it returns arrays and I found Google uses a structure like this:
>
> <resultElements
> xmlns:ns3="http://schemas.xmlsoap.org/soap/encoding/"
> xsi:type="ns3:Array" ns3:arrayType="ns1:ResultElement[10]">
>
> Why are these two structrues for handleing SOAP arrays different, and what
> can I do to make PEAR::SOAP generate a structure similar to the Google
> structure? Ohh and from my PEAR::SOAP server the SOAP-ENC namespace
points
> to the same location as Google's ns3.
>
> Thanks,
> Rob
>
>