1

複合型の配列を返すSOAPサービスがあります。PHPのNuSOAPの定義は次のようになります。

// The type itself
$server->wsdl->addComplexType(
    "Clip",
    "complexType",
    "struct",
    "all",
    "",
    array(
      "Id" => array(
        "name" => "id",
        "type" => "xsd:int"
      )
      // ---snip---
    )
  );

// The type of the array
$server->wsdl->addComplexType(
    "ClipList",
    "complexType",
    "array",
    "sequence",
    "",
    array(
      "clip" => array(
        "name"      => "clip",
        "type"      => "tns:Clip",
        "minOccurs" => "0",
        "maxOccurs" => "unbounded"
      )
    ),
    array(),
    "tns:Clip"
  );

  // The service
  $server->register(
    "GetClipList",
    array(),
    array(
      "clips" => "tns:ClipList"
    ),
    "urn:MyNamespace",
    "urn:MyNamespace#GetClipList",
    "rpc",
    "encoded",
    "Retrieves a list of all clips."
  );

VisualStudio2010 C#プロジェクトで、生成されたWSDLに基づいて新しいサービスを追加しました。ClipListVSは、タイプが単一のデータメンバーを持つクラスを含む、使用するプロキシクラスを作成しましたClip[]

ここまでは順調ですね。GetClipList()プロキシを呼び出すと、タイプのオブジェクトCommunicationExceptionをタイプのオブジェクトに割り当てることができないというメッセージが表示されます。Clip[]ClipList

したがって、返されたデータをに逆シリアル化し、 メソッドClip[]の戻り型()を満たす必要があると想定しています。GetClipListClipList

GetClipList()プロキシのの戻り値をClip[]手動に変更すると、アプリケーションは正常に実行されます。しかし、明らかな理由で、自動生成されたクラスを変更することは避けたいと思います。

では、なぜそれがインスタンス化されClipListてデータメンバーを埋めないのでしょうか?または、代わりに、VSがプロキシクラスを生成しないのはなぜGetClipListですかClip[]

4

2 に答える 2

1

私は構造の配列の問題を解決しました:

$server->wsdl->addComplexType(
        'clsDispIds',
        'complexType',
        'struct',
        'sequence',
        '',
        array(
                'id_disp' => array('name' => 'id_disp', 'type' => 'xsd:int'),
                'id_loc' => array('name' => 'id_loc', 'type' => 'xsd:string')
        )
);

// array di clsDispIds
$server->wsdl->addComplexType(
    'arrclsDispIds',
    'complexType',
    'array',
    'sequence',
    '',
    array(
        'item' => array('name' => 'item', 'type'=>'tns:clsDispIds','minOccurs' => '0', 'maxOccurs' => 'unbounded')
    )
);    

$server->register( 
    'GetIdDispCollection',                  // nome operazione
    array('id'=>'xsd:int'),                 // input 
    array('return'=>'tns:arrclsDispIds'),   // output
    NAMESPACE, 
    true,
    'document',
    'literal',
    'restituisce tutti i dispositivi per il canale specificato',
    'http://schemas.xmlsoap.org/soap/encoding/'
);

nuSoap には応答の作成に関するバグがあり、配列要素ごとにタグ「item」が自動的に追加されるため、complexType には必須の名前「item」があります。

これは、php、java、および .net によって正しく逆シリアル化された私の応答です

stdClass Object ( 
[return] => stdClass Object ( 
    [item] => Array ( [0] => stdClass Object ( [id_disp] => 11718 [id_loc] => '') 
              [1] => stdClass Object ( [id_disp] => 11722 [id_loc] => '') 
              [2] => stdClass Object ( [id_disp] => 11723 [id_loc] => '') 
              [3] => stdClass Object ( [id_disp] => 11724 [id_loc] => '') 
            ) ) )
于 2010-05-31T15:05:39.963 に答える
1

W3C SOAP 標準の一部をもう一度読んだ後、Clip 配列の次の定義を思いつきました。

$server->wsdl->addComplexType(
  "ArrayOfClip",
  "complexType",
  "array",
  "sequence",
  "SOAP-ENC:Array",
  array(),
  array(
    array(
      "ref"            => "SOAP-ENC:arrayType",
      "wsdl:arrayType" => "tns:Clip[]",
      "minOccurs"      => "0",
      "maxOccurs"      => "unbounded"
    )
  ),
  "tns:Clip"
);

wsdl.exe と vscutil.exe を使用した以前のテストでは、それに同意していないようだったので、実際にはソースで既にコメントアウトされているような定義がありました。ただし、VisualStudio の統合サービスのインポートには、この定義が必要なようです。

于 2010-04-15T16:17:25.053 に答える