2

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が定義されている場所であることは理解しています。

だから私の質問はマルチパートです:

  1. これはSoapServerの既知のバグですか?
  2. そうでない場合、WSDLに何か悲惨なものが欠けていますか?
  3. オブジェクトを正しくエンコードしていませんか?
  4. これは.Netの問題ですか?もしそうなら、回避策は何ですか?
4

1 に答える 1

1

この問題は、Google WSDL<types/>を参照して、WSDL のセクションを再度調べて解決することができました。次に、適切な の要素を WSDL のそれぞれの型にキャストし、コマンド全体を. WSDL と連携すると、これはすべてうまくまとまり、.Net ではまったく問題がありません。$commandns2:command

開発コミュニティの誰もこれに答えようとしなかったことに驚いていますが、誰かがこの問題の自分のインスタンスを修正する方法について、少なくとも何らかの方向性をそこから収集できることを願っています.

于 2011-05-20T02:34:19.840 に答える