- PR -

【WebLogic8.1/Webサービス】.NETクライアントからの取得データ

投稿者投稿内容
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-10-19 14:02
クライアント:
 VB.NET

サーバ:
 WebLogic8.1評価版


Webサービスは非常に単純であり、下記クラスです

コード:
import java.util.*;
public class Sample {
  public void put( ArrayList list ) {
    for( int i=0; i<list.size(); i++ ) {
      System.out.println( list.get(i) );
    }
  }
}



さて、この構成で、まずJava-Javaで試してみたところ期待どおり

122
233
dsad

など引数に与えた配列を認識してくれます。


同じように.NETから本Webサービスにアクセスすると

<Item>122</Item>
<Item>233</Item>
<Item>dsad</Item>

と、タグを含む結果となってしまいます。
.NET側ではIDEでWebサービスの参照からスタブを自動生成し
手動で何か特殊なコードを書いたわけではありません。

何故このようなフォーマットの違い?が生じるのかがわかりません。
同じような現象にあった方はおられますでしょうか?
そのときの対処方法を教えて頂きたいです。

サーバ側のロジックでいちいちタグを切るとかってことはあんまり
したくないなぁと。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-10-19 14:49
SampleクラスのメソッドはvoidでWebサービスにするのはちょっと難しそうですが、具体的にどのようにしてWebサービスを実装しているんでしょうか?

ひとまずリクエスト・レスポンスのデータをキャプチャして確認してみてはいかがでしょうか。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-10-19 15:34
引用:

インギさんの書き込み (2004-10-19 14:49) より:
SampleクラスのメソッドはvoidでWebサービスにするのはちょっと難しそうですが、具体的にどのようにしてWebサービスを実装しているんでしょうか?

ひとまずリクエスト・レスポンスのデータをキャプチャして確認してみてはいかがでしょうか。



このWebサービスは引数をArrayListにした場合、ちゃんと渡せるかどうかだけを
試したかったものなので、戻り値は特に意識していませんでした。

キャプチャに関してですが、.NETクライアントからのSOAPリクエストはAxisの
tcpmonitorを使用して拾えました。

しかしながら、WebLogicのclientgen antタスクによって生成されたスタブ経由
で同様にキャプチャしようとしたのですがエラーが出てしまって、今はなんとか
試行錯誤してやっているところです。


とりあえず、.NETクライアントからのリクエストの一部抜粋を下記に示します。

コード:
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding"/>
  <tns:put>
    <arrayList href="#id1"/>
  </tns:put>
  <soapenc:Array id="id1"/>
    <Item>122</Item> 
    <Item>233</Item> 
    <Item>dsad</Item>
  </soapenc:Array>
</soap:Body>

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-10-19 15:42
>このWebサービスは引数をArrayListにした場合、ちゃんと渡せるかどうかだけを
>試したかったものなので、戻り値は特に意識していませんでした。
サーバ側で表示するだけのコードなんですね。なにかクライアントに返すものと勘違いしていました。
#ってよく読めばわかりますね

>しかしながら、WebLogicのclientgen antタスクによって生成されたスタブ経由
>で同様にキャプチャしようとしたのですがエラーが出てしまって、今はなんとか
以下のようなツールなら確実にキャプチャできますよ。

・Ethereal
http://www.ethereal.com/
・Packetyzer
http://www.networkchemistry.com/products/packetyzer/
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-10-19 16:32
引用:

・Ethereal
http://www.ethereal.com/
・Packetyzer
http://www.networkchemistry.com/products/packetyzer/




今まさにこのツールで確認しようとしているのですが
なかなか取れません。

取り方は本題の質問とズレるのでもうちょっとやってみますが
クライアント(スタブ)からの要求ってhttpプロトコロルをフィルタ
すれば見れるはずですよね?


javaクライアント(スタブ)は以下のように生成・実行しています。
・clientgen antタスクを実行
 build.xmlの一部抜粋
コード:
<target name="stub">
    <clientgen wsdl="http://**.**.**.**:7001/webservice/Sample?WSDL" 
               packageName="sample" 
               clientJar="${client}/client.jar"
               autoType="True"
    >
      <classpath>
         <pathelement path="C:/bea/weblogic81/server/lib/webservices.jar"/>
         <pathelement path="C:/bea/weblogic81/server/lib/webserviceclient.jar"/>
       </classpath>
     </clientgen>
  </target>



・Cient.javaを作成
 コードは以下のような感じ
コード:
import sample.*;

public class Client {
	public static void main( String[] args ) {
		try {
			SampleService service = new SampleService_Impl( "http://**.**.**.**:7001/webservice/Sample?WSDL" );
			SampleServicePort port = service.getSampleServicePort();
			
			port.putMap( new Object[]{ "122", "33", "dsad" } );
		} catch ( Exception e ) {
			e.printStackTrace();
		}
	}
}



・Client.javaを実行





どうもhttpでフィルタかけても取れないんですよね・・。
IEでWebサービスの公開ページへつなぐとうまく取れるんですけどね。


もうちとがんばってみます。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-10-19 17:25
localhost にアクセスしてキャプチャしようとしていませんか?
ほかの PC からアクセスするようにしないと実際にパケットが飛びませんので取得できませんよ。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-10-19 17:27
取れました。

結局以下のような結果となりました。
【正常】(Java/WebLogic8.1の自動生成Stub使用)
コード:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <env:Body env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <m:putMap xmlns:m="http://**.**.**.**:7001/webservice">
      <arrayList soapenc:arrayType="xsd:anyType[3]">
        <anyType xsi:type="xsd:string">122</anyType>
        <anyType xsi:type="xsd:string">233</anyType>
        <anyType xsi:type="xsd:string">dsad</anyType>
      </arrayList>
    </m:putMap>
  </env:Body>
</env:Envelope>



【異常】(.NET/VB2005の自動生成Stub使用)
コード:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope 
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
  xmlns:tns="http://**.**.**.**:7001/webservice" 
  xmlns:types="http://**.**.**.**:7001/webservice/encodedTypes" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <tns:putMap>
      <arrayList href="#id1" />
    </tns:putMap>
    <soapenc:Array id="id1" soapenc:arrayType="xsd:string[3]">
      <Item>122</Item>
      <Item>233</Item>
      <Item>dsad</Item>
    </soapenc:Array>
  </soap:Body>
</soap:Envelope>



両者ともにhttp://**.**.**.**:7001/webservice/Sample?wsdlを参照して
自動生成されたStubを使用しています。

明らかにフォーマットが異なっているのですが、これは.NETとJavaであるが
故なのでしょうか。

(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-10-20 14:51
なんとなくですが原因が判明しました。

【原因】
SOAP仕様に準拠していないメッセージを出していたため。

【箇所】
<Item>122</Item>

は、本来

<Item xsi:type="xsd:string">122</Item>

であるべきだということがわかりました。


【考察】
今回使用したのはVB.NET2005β版です。
これは.NETFramework2.0対応らしくメッセージを構築しているのも
こいつかと思います。

対して、もう一つ.NETFrmaework1.1SDKからwsdl.exeを使用して
Stubを作りWebサービスクライアントを構築してみたら、正常な
メッセージを出しました。


おそらく.NETFramework2.0(これもβ版?)のバグではないかと思うのですが
よくわかっていません。



実機ではVS.NET2003を使用するので.NETFramework1.1ということから
大丈夫ではないかと思われます。

スキルアップ/キャリアアップ(JOB@IT)