連載 :
Webの限界を超えるリアルタイムWebWCF+Silverlightで作るリアルタイムWeb(後編)
2011年3月22日(火)

はじめに
本連載では、前回から以下のようなWCF+Silverlightアプリケーションを作成しています。
今回は前回に続いて、サンプルを完成させていきましょう。
→サンプル一式は、会員限定特典としてダウンロードできます。記事末尾をご確認ください。
非同期結果を送信するスタンダードなWCFサービスの作成
サーバーから開始されるメッセージ交換を通常のWCFサービスとして作成して動作を確認します。後に、先ほど作ったサービスと一緒に双方向通信に変更します。
(1)WCFがクライアントに返すデータ型を定義
WCFが返す結果セットクラスを実装側DeskTopStateServiceクラス内に作成します。DeskTopStateTypeと並列にDeskTopStateSetクラスとして作成します。クライアント側でもこのクラスを使うので、属性を付けてクライアントコードを自動生成するようにします。
[リスト 04]結果セットのデータ型の定義
01 | <!--//--><![CDATA[// ><!-- |
02 |
03 | [DataContract(Name = "DeskTopStateSet")] |
04 | public class DeskTopStateSet |
05 | { |
06 | [DataMember(Name = "ID")] |
07 | public string ID { get; set; } |
08 | [DataMember(Name = "State")] |
09 | public string State { get; set; } |
10 | } |
11 |
12 | //--><! |
(2)サーバープッシュとなるWCFサービスを作成
この結果セットを返すGetStateというサービスをサービス実装側のSetStateと並列に追加し、インターフェース側も合わせます。
[リスト 05]XMLファイルに保存されているIDとStateのセットを全部取得(社員全員の在席状態の取得)
01 | <!--//--><![CDATA[// ><!-- |
02 |
03 | public IEnumerable<DeskTopStateSet> GetState() |
04 | { |
05 | string path = HostingEnvironment.ApplicationPhysicalPath + @"App_Data\DeskTopStates.xml"; |
06 | IEnumerable<DeskTopStateSet> states = from n in XElement.Load(path).Elements() |
07 | where n.Element("ID").Value != "" |
08 | select new DeskTopStateSet{ID = n.Element("ID").Value , State = n.Element("State").Value}; |
09 | return states; |
10 | } |
11 |
12 | //--><! |
(3)上記サービスのインターフェースを作成
インターフェース側も作成しておきます。
[リスト 06]作成したサービスの公開インターフェースを定義
01 | <!--//--><![CDATA[// ><!-- |
02 |
03 | [ServiceContract] |
04 | public interface IDeskTopStateService |
05 | { |
06 | [OperationContract] |
07 | DeskTopStateType SetState(int id,DeskTopStateType type); |
08 | [OperationContract] |
09 | IEnumerable<DeskTopStateService.DeskTopStateSet> GetState(); |
10 | } |
11 |
12 | //--><! |
(4)上記サービスのクライアント側の呼び出しを作成
サービス参照の更新を行ってから、クライアント側の呼び出しを作成します。SetStateの呼び出しはコメントアウトします。
[リスト 07]クライアンからの呼び出し
01 | <!--//--><![CDATA[// ><!-- |
02 |
03 | public partial class MainPage : UserControl |
04 | { |
05 | public MainPage() |
06 | { |
07 | InitializeComponent(); |
08 | DeskTopStateService.DeskTopStateServiceClient proxy = new DeskTopStateService.DeskTopStateServiceClient(); |
09 | //proxy.SetStateCompleted += new EventHandler<DeskTopStateService.SetStateCompletedEventArgs>(proxy_SetStateCompleted); |
10 | //proxy.SetStateAsync(666, DeskTopStateService.DeskTopStateType.DayOff); |
11 | proxy.GetStateCompleted += new EventHandler<DeskTopStateService.GetStateCompletedEventArgs>(proxy_GetStateCompleted); |
12 | proxy.GetStateAsync(); |
13 | } |
14 | void proxy_GetStateCompleted(object sender, DeskTopStateService.GetStateCompletedEventArgs e) |
15 | { |
16 | this.label1.Content = "ログイン件数:" + e.Result.Count; |
17 | } |
18 | … |
19 | } |
20 |
21 | //--><! |
(5)上記サービスの動作を確認
F5を押して、実行結果を確認してください。
「WCF+Silverlightで作るリアルタイムWeb(後編)_1」サンプルプログラム
「WCF+Silverlightで作るリアルタイムWeb(後編)_2」サンプルプログラム
「WCF+Silverlightで作るリアルタイムWeb(後編)_3」サンプルプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。