.net でwsdlを参照時、クライアント側実行時に配列エラーで落ちる時の対処

状況

WSDLを使用して.netのWEB参照でクライアントクラスを作成すると、コンパイルは通るが、実行時に落ちる。

原因

通常のWEB参照を使ってWSDLからクライアントクラスを作った場合、XSD上で
下記のように、1要素のなかで maxOccursにunbounded指定がある場合
解釈の仕方が異なる(二次元配列に変換される)ため。

対処

上記のような要素がある場合は、無理やりダミー要素をつっこんだ下記のようなXSDを作成する。

<xs:sequence>
 <xs:element maxoccurs="unbounded" minoccurs="0" name="requestId" nillable="true" type="xs:int">
 <xs:element maxoccurs="0" minoccurs="0" name="DummyrequestId">
 </xs:element></xs:element><
/xs:sequence>

ダミー要素を突っ込むことで、解釈は同一になり、 かつダミー要素は使用しない(サーバー側ではうけとらない)ので 問題は発生しない。 その上で、下記手順により直接WSDLコマンドをたたいてクライアントクラスを作成する。

  1. WSDL、修正したXSDファイルをネット参照できる場所に置く  (今回はドロップボックス利用。ローカルでもできるのかもしれないがうまくWSDLコマンドが動作しなかった)
  2. コマンドプロンプトを開く
  3. cd C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools   場所は、WSDL.exeのある場所。バージョンによって   C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin   等異なる。
  4. wsdl /language:VB /out:Reference.vb /namespace:OrderApi https://dl.dropboxusercontent.com/u/71006786/RakutenSsdl/r.wsdl  のように、コマンドをたたく(ドロップボックスの部分は1でおいた場所)
  5. できあがった、Reference.vbをプロジェクトに取り込んで使用。

補足 

余計なファイルが作成されず、セッティングファイル(Settings.settings)の変更もされないので 今回のような修正が発生する場合にかぎらず、wsdlを使用する場合はこのやり方のほうが シンプルで良い気がする。

某ショッピングモールのAPI変更に伴い修正を行う際、これがおこりかなり苦しんだ・・・。しかも同タイミングで、このモールは.netのサポートをやめている。これも原因のひとつなのかもしれないなー・・。

0 件のコメント :

コメントを投稿