我使用nuSOAP在PHP中有一个web服务。 webservice返回一个对象数组。 使用时
$server->wsdl->addComplexType(
"thingArray", // type name
"complexType", // soap type
'array', // php type (struct/array)
'sequence', // composition (all/sequence/choice)
'', // base restriction
array( // elements
'item' => array(
'name' => 'item',
'type' => 'tns:thing',
'minOccurs' => '0',
'maxOccurs' => 'unbounded'
)
),
array(), // attributes
"tns:thing" // array type
);
WCF客户端在调用时失败,抱怨它无法将thing []转换为thingArray。
答案 0 :(得分:0)
首先关闭 - 记得打开UTF8,以便WCF能够理解响应。
// Configure UTF8 so that WCF will be happy
$server->soap_defencoding='UTF-8';
$server->decode_utf8=false;
为了使WCF理解数组,我们需要使用数组的SOAP编码而不是序列组合。
这将使nuSOAP发出WCF可以使用的数组:
$server->wsdl->addComplexType(
'thingArray', // type name
'complexType', // Soap type
'array', // PHP type (struct, array)
'', // composition
'SOAP-ENC:Array', // base restriction
array(), // elements
array( // attributes
array(
'ref'=>'SOAP-ENC:arrayType',
'wsdl:arrayType'=>'tns:thing[]'
)
), // attribs
"tns:thing" // arrayType
);
此类型现在可以在响应中使用,WCF客户端将很乐意使用nuSOAP生成的SOAP响应。
// Register the method to expose
$server->register('serviceMethod', // method name
array('param1' => 'tns:thingArray'), // input parameters
array('return' => 'tns:thingArray'), // output parameters
$ns, // namespace
$ns.'#serviceMethod', // soapaction
'rpc', // style
'encoded', // use
'Says hello' // documentation
);
WCF客户端最终看起来像这样:
var client = new Svc.servicePortTypeClient();
thing[] things = new thing[3];
thing[] result = client.serviceMethod(things);
foreach( thing x in result )
{ ... do something with x ... }