- (株)ぽち
- ぬし
- 会議室デビュー日: 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
今まさにこのツールで確認しようとしているのですが
なかなか取れません。
取り方は本題の質問とズレるのでもうちょっとやってみますが
クライアント(スタブ)からの要求って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ということから
大丈夫ではないかと思われます。
|