- PR -

WEBサービスの戻り値にコレクションクラス

1
投稿者投稿内容
yama
会議室デビュー日: 2002/12/25
投稿数: 10
投稿日時: 2004-05-24 11:42
お世話になっております。
VB.NETでWebサービスとクライアントの通信でコレクションクラスを扱いたいと
考えています。
下記のCollectionBaseを継承したコレクションクラスを含むDLLがあり、
Webサービス側、クライアント側それぞれに参照設定し、クラスを受け渡すメソッド
を用意してクライアント側でコレクションクラスのまま取得したいのですが、
Webサービスとクライアントの間ではコレクションクラスではなく、
クラスの配列として扱われます。

クライアント側でこれを同一のクラスを用いてコレクションクラスとして
利用したいと考えているのですが、どなたかよい知恵をお持ちの方はいらっしゃいませんでしょうか?


' 利用したいコレクションクラス
Public Class ItemData
Private _Name As String

Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal Value As String)
_Name = Value
End Set
End Property
End Class

Public Class CollectionData
Inherits Collections.CollectionBase

Default Property item(ByVal index As Integer) As ItemData
Get
Return CType(innerlist.Item(index), ItemData)
End Get
Set(ByVal Value As ItemData)
innerlist.Item(index) = Value
End Set
End Property

Sub Add(ByVal Value As ItemData)
innerlist.Add(Value)
End Sub
End Class


Webサービス側 WSCollectionData
<WebMethod()> _
Public Function Contains() as CollectionData
return _CollectionData
End Function

↓ CollectionDataクラスのインスタンスを返す

クライアント側
WEBサービスからのクラスを受け取る場合、
配列に変換?されてコレクションクラスとはならない
→WEBサービスのCollectionDataクラスはWEB参照設定時にWDSLの定義によって"配列"と解釈される


このとき、WEBサービスから返されるクラスをクライアント側でコレクションクラスとして
使用したいと考えています。クライアント側はこんな感じで、

' WEBサービスクラス
_Ws = New WSCollectionData.WSCollectionData

' WEBサービスの戻り値取得用
Dim ItemArray() As WSCollectionData.ItemData
' クライアント側 参照設定でのCollectionDataクラス
Dim ItemCollection As CollectionDataLibrary.CollectionData

としたとき

ItemArray = _Ws.Contains

はOKなのですが、イメージとしてやりたいのは

ItemCollection = _Ws.Contains

としたいのですが、これは型が違うためNG。
クラスの型が参照のされ方によって別物と判断されてしまうのでしょう。

WEBサービスからスマートにコレクションクラスを受け取ることは
できるのでしょうか?

よろしくお願いします。
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2004-05-24 14:20
CollectionBaseから派生すると、自動的に配列に変わってしまいますね。
いろいろ試してみましたが、わかりませんでした。情報なくてすいません。
本来やりたいことを書いてもらえば、案が出るかもしれません。
yama
会議室デビュー日: 2002/12/25
投稿数: 10
投稿日時: 2004-05-25 11:07
catsさん、レスありがとうございます。

いまサンプルとして考えているのは、WEBサービスから取得したコレクションクラスを
リストボックスのDataSourceとしてそのまま使用したいと考えています。
(ここではItemDataクラスのNameプロパティをリスト表示する)

またこの方法が取れるなら、応用の範囲は広いかと。
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2004-05-25 16:28
ListBoxのDisplayMemberにはプロパティしか設定できないのに、
Webサービスのプロクシにはプロパティがなくなってしまうのが
問題ですかね。

うまい方法は思いつきません。
(案1) Webサービスでstring[]を返すようにする
(案2) Webサービスの結果を加工する
yama
会議室デビュー日: 2002/12/25
投稿数: 10
投稿日時: 2004-05-26 10:07
WEBサービスのWSDL(定義って言っていいのかな?)でも、コレクションクラスは
ArrayOf〜になってしまうので、やっぱり配列として受けることを前提の方法を
検討するしかなさそうですね。

お手数をおかけしました。ありがとうございましたっ!
1

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