SoapServerクラスを使用してPHPでWebサービスを構築していますが、複雑な型のキャストで問題が発生しています。
WSDLは完全に有効であり、PHP SoapClientはそれを完璧に処理しますが、返される複合型が適切にキャストされないという問題があるようです。これは、.Netでサービスを使用するときに明らかになりました。これは、指定された名前空間にタイプが存在しないことを示す例外が発生したためです。
関数を何度も壊して要素の名前空間を変更しましたが、使用する名前空間に関係なく、.Netでエラーが発生し続けます。
スクリプトの次の省略形を検討してください。
function getCommands() {
$output = array();
// ...
foreach($result as $row) {
$output[] = new SoapVar($row, SOAP_ENC_OBJECT, 'ns1:command');
}
return $output;
}
省略された応答:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="urn:MyWebService"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getCommandsResponse>
<return SOAP-ENC:arrayType="ns1:command[12]" xsi:type="ns1:ArrayOfCommand">
<item xsi:type="ns1:command">
<!-- ... -->
</item>
<!-- ... -->
</return>
</ns1:getCommandsResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
私が気付いたのは、xmlns:ns1
それがWSDLによって定義されており、WSDLの名前空間と一致していることです。command
ただし、.Net SOAPクライアントは、要素がそこで定義されていることを理解していないようです。ただし、それArrayOfCommand
が定義されている場所であることは理解しています。
だから私の質問はマルチパートです:
- これはSoapServerの既知のバグですか?
- そうでない場合、WSDLに何か悲惨なものが欠けていますか?
- オブジェクトを正しくエンコードしていませんか?
- これは.Netの問題ですか?もしそうなら、回避策は何ですか?