- PR -

オブジェクト型配列変数をWEBサービスメソッド引数への引渡し

1
投稿者投稿内容
koike
会議室デビュー日: 2004/10/18
投稿数: 6
投稿日時: 2004-10-18 19:22
お世話になります。

WEBサービスのAPが上手く動きません。

オブジェクト型の変数に文字列を代入した場合は、上手く動作します。
しかし、文字列の配列を代入した場合は、動作しません。
このときのエラーメッセージは、

   『追加情報 : XML ドキュメントを生成中にエラーが発生しました。』

です。
原因解決や回避方法等が有りましたら、よろしくお願いいたします。

'クライアント側

Dim service As New localhost1.Service1
Dim wkin As Object
Dim wkin2 As Object
wkin = "こんにちは!"
wkin2 = New Object() {"こんばんは!", "おやすみ"}
service.HelloWorld(wkin)  '引数のオブジェクト型の変数の中が文字列の時は上手く動作
service.HelloWorld(wkin2) '引数のオブジェクト型の変数の中が文字列の配列時は、NG


'WEBサービス側

<WebMethod()> _
Public Function HelloWorld(ByVal p1 As Object) As String
Return p1
End Function
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-10-19 09:21
引用:

koikeさんの書き込み (2004-10-18 19:22) より:

オブジェクト型の変数に文字列を代入した場合は、上手く動作します。
しかし、文字列の配列を代入した場合は、動作しません。
:
コード:

'WEBサービス側
<WebMethod()> _
Public Function HelloWorld(ByVal p1 As Object) As String
Return p1
End Function




配列を渡した場合「」を返したいのか読み取れません。
Webサービスかどうかも関係なく、普通のFunctionですらうまく行かないと思います。

上のコードは、厳密にはどうなるか知りませんが「Option Strict On」の状態では下記のようなコードになって、Stringへのキャストが失敗して InvalidCastException が内部的に発生して変換できてないような気がします。
コード:

Option Strict
'WEBサービス側
<WebMethod()> _
Public Function HelloWorld(ByVal p1 As Object) As String
Return DirectCast(p1,String)
End Function



まず、配列を渡したときに何を返したいのかはっきりしない状況では、「そりゃObject配列をStringに勝手には変換できないでしょ」で終わってしまいますが…。

#いまだにVB系ではOption Strict Offが普通なのでしょうか。

[追記]
WebサービスでObject型で受けたり値を返したりする(しかも内容が文字列だったり配列だったり入れ替わる)のって、WSDLと流れるSOAPメッセージとが食い違う気がする。(試せる環境が今ないので「気がする」だけ)
GotDotNetJapan掲示板で、DataSetを流すときは相互運用性がどうのこうのという議論がありましたが、(DataSetほどじゃないにしても)同じような状況?

[ メッセージ編集済み 編集者: JW 編集日時 2004-10-19 10:13 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2004-10-19 20:05
引用:
'クライアント側

Dim service As New localhost1.Service1
Dim wkin As Object
Dim wkin2 As Object
wkin = "こんにちは!"
wkin2 = New Object() {"こんばんは!", "おやすみ"}
service.HelloWorld(wkin)  '引数のオブジェクト型の変数の中が文字列の時は上手く動作
service.HelloWorld(wkin2) '引数のオブジェクト型の変数の中が文字列の配列時は、NG


'WEBサービス側

<WebMethod()> _
Public Function HelloWorld(ByVal p1 As Object) As String
Return p1
End Function

そもそもwkin2はArrayなのでStringとしてReturnできないのでは?
wkin2(1) とかなら大丈夫かもしれませんが。
koike
会議室デビュー日: 2004/10/18
投稿数: 6
投稿日時: 2004-10-19 22:16
回答、ありがとうございます。

まず、今回の質問のポイントは、引数の引渡しです。
で、VB6のCOMでは、両方のケースがOKで、WEBサービスだと配列の場合にNGです。

試行錯誤の結果、WEBサービスでの配列の受け渡しは、以下で大丈夫でした。

<WebMethod()> _
Public Function HelloWorld(ByVal p1() As Object) As String
Return p1
End Function

つまり、VB6のCOMでは、1つの関数ですんでいた所を、VB.NETのWEBサービスでは、場合によって、関数を2つ(オーバーロード)書かなければならないみたいです。

以上です。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-10-20 10:07
WebServiceなので、COMがどうとかは関係ないと思いますが、.NETでは厳密に型というものを意識してプログラミングを行います。

まず初めに、ソースの先頭に
Option Strict On
と書いてください。
これは、質の良いプログラムを書くための約束事です。
VisualStudioを使っているなら、「ソリューションエクスプローラ」のプロジェクトを右クリックして、プロパティを開いてください。
「ビルド」という項目の中に「Option Strict」という項目がありますので、それをOnにしても構いません。

で、今回のソースですが、HelloWorld()に渡したいインスタンスの型は2つありますよね。
stringとstring()です。
初めHelloWorld()の引数の型はobject型でした。
そして渡された引数を、HelloWorld()の中でstring型として扱っています。
stringはstringとして扱えますが、string()はstringとして扱えないのでNGになっていたわけです。
次にHelloWorld()に引数違いのメソッドを多重定義したわけですか?
引数の型はobject()のようですが、こいつはstringに変換できません。ですので、
引用:

koikeさんの書き込み (2004-10-19 22:16) より:
<WebMethod()> _
Public Function HelloWorld(ByVal p1() As Object) As String
Return p1
End Function


これはコンパイル通りませんよね?

それに、WebMethodはMessageNameを付けてやらないとオーバーロードできないと思いますが・・・・
そのソース本当に動いてますか?
koike
会議室デビュー日: 2004/10/18
投稿数: 6
投稿日時: 2004-10-20 12:45
>まず初めに、ソースの先頭に
>Option Strict On
>と書いてください。

了解いたしました。

>これはコンパイル通りませんよね?

確かにそうでした。
Return p1
は、
Return p1(0)
の記述間違いでした。

>そのソース本当に動いてますか?
実際は、Return p1(0)になっていましたので、動いています。

以上です。
皆様、アドバイスありがとうございました。
1

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