- - PR -
オブジェクト型配列変数をWEBサービスメソッド引数への引渡し
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 | ||||||||||||
|
投稿日時: 2004-10-19 09:21
配列を渡した場合「何」を返したいのか読み取れません。 Webサービスかどうかも関係なく、普通のFunctionですらうまく行かないと思います。 上のコードは、厳密にはどうなるか知りませんが「Option Strict On」の状態では下記のようなコードになって、Stringへのキャストが失敗して InvalidCastException が内部的に発生して変換できてないような気がします。
まず、配列を渡したときに何を返したいのかはっきりしない状況では、「そりゃObject配列をStringに勝手には変換できないでしょ」で終わってしまいますが…。 #いまだにVB系ではOption Strict Offが普通なのでしょうか。 [追記] WebサービスでObject型で受けたり値を返したりする(しかも内容が文字列だったり配列だったり入れ替わる)のって、WSDLと流れるSOAPメッセージとが食い違う気がする。(試せる環境が今ないので「気がする」だけ) GotDotNetJapan掲示板で、DataSetを流すときは相互運用性がどうのこうのという議論がありましたが、(DataSetほどじゃないにしても)同じような状況? [ メッセージ編集済み 編集者: JW 編集日時 2004-10-19 10:13 ] | ||||||||||||
|
投稿日時: 2004-10-19 20:05
wkin2(1) とかなら大丈夫かもしれませんが。 | ||||||||||||
|
投稿日時: 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つ(オーバーロード)書かなければならないみたいです。 以上です。 | ||||||||||||
|
投稿日時: 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に変換できません。ですので、
これはコンパイル通りませんよね? それに、WebMethodはMessageNameを付けてやらないとオーバーロードできないと思いますが・・・・ そのソース本当に動いてますか? | ||||||||||||
|
投稿日時: 2004-10-20 12:45
>まず初めに、ソースの先頭に
>Option Strict On >と書いてください。 了解いたしました。 >これはコンパイル通りませんよね? 確かにそうでした。 Return p1 は、 Return p1(0) の記述間違いでした。 >そのソース本当に動いてますか? 実際は、Return p1(0)になっていましたので、動いています。 以上です。 皆様、アドバイスありがとうございました。 |
1