WCF+Silverlightで作るリアルタイムWeb(後編)

2011年3月22日(火)
高尾 哲朗(監修:山田祥寛)

はじめに

本連載では、前回から以下のようなWCF+Silverlightアプリケーションを作成しています。

図1:今回作成するアプリケーションの概念図(クリックで拡大)

今回は前回に続いて、サンプルを完成させていきましょう。

サンプル一式は、会員限定特典としてダウンロードできます。記事末尾をご確認ください。

非同期結果を送信するスタンダードな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を押して、実行結果を確認してください。

図2:結果の確認(クリックで拡大)
  • 「WCF+Silverlightで作るリアルタイムWeb(後編)_1」サンプルプログラム

  • 「WCF+Silverlightで作るリアルタイムWeb(後編)_2」サンプルプログラム

  • 「WCF+Silverlightで作るリアルタイムWeb(後編)_3」サンプルプログラム

著者
高尾 哲朗(監修:山田祥寛)
WINGSプロジェクト

有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表:山田祥寛)。おもな活動は、Web開発分野の書籍/雑誌/Web記事の執筆。ほかに海外記事の翻訳、講演なども幅広く手がける。2011年3月時点での登録メンバは36名で、現在もプロジェクトメンバーを募集中。執筆に興味のある方は、どしどしご応募頂きたい。著書多数。
http://www.wings.msn.to/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています