WCFのHelloWorld(クライアント編)

WCFのHelloWorld(サーバ編) - y_maeyamaの日記WCFサービスの用意が完了しました。今度はSilverlightアプリケーションからWCFサービスをコールします。

開発環境

この記事は以下の環境でのコーディングしています。

手順

  1. WCFプロキシクラスの生成
  2. WCFコールの実装

WCFプロキシクラスの生成

VisualStudioのサービス参照の追加機能でWCFプロキシクラスを生成します。プロキシクラスはWCFサービスにアクセスするために必要な機能を提供します。サーバ編で作成したsvcファイル単位でプロキシクラスを生成します。
以下、生成手順です。
Silverlightプロジェクトを右クリックして、コンテキスメニューを開きます。コンテキストメニューのサービス参照の追加を選択します。

表示されたダイアログの検索ボタンを押します。すると参照可能なWebサービス一覧が表示されますので、HelloWorldServiceを選択します。
次に、生成されるプロキシクラスが所属するネームスペースを設定します。今回は、「HelloWorld」としました。以上の作業が完了しましたら、OKボタンを押します。

以下のファイルとアセンブリ参照がSilverlightプロジェクトに追加されます。

追加されたもの
ファイル ServiceReferences.ClientConfig,HelloWorldServiceClientクラスとその関連クラス
アセンブリ参照 System.Runtime.Serialization.dll, System.ServiceModel.dll
  • ServiceReferences.ClientConfig … WCFのエンドポイント(WCFはどこにあるのか?通信方式は何か?など)を設定するファイル。
  • HelloWorldServiceClientクラス … WCFプロキシクラス。このクラスを使用してWCFをコールする。

WCFコールの実装

MainPage.xamlに各コントロールを配置します。

<UserControl x:Class="WCFHelloWorld.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <StackPanel x:Name="LayoutRoot" Background="White">
        <StackPanel Orientation="Horizontal" Margin="5">
            <TextBlock Text="名前 : " VerticalAlignment="Center"/>
            <TextBox x:Name="TbxName" Width="150"/>
        </StackPanel>
        <Button x:Name="BtnHelloWorld" Content="Hellow World" HorizontalAlignment="Center" Margin="5"/>
        <TextBlock x:Name="TblResult" />
    </StackPanel>
</UserControl>

次に、HelloWorldボタンが押されたときにWCFコールするようにします。
MainPage.xaml.csにプロキシクラス用usingを追加します。

// WCFプロキシクラスが含まれるネームスペースをusingに追加
using WCFHelloWorld.HelloWorld;

ボタンクラスイベントハンドラを実装します。

private void BtnHelloWorld_Click(object sender, RoutedEventArgs e)
{
    string name = TbxName.Text;
    this.CallHelloWorldGetMessage(name);
}

/// <summary>
/// HelloWorldサービスのGetMessageメソッドを呼ぶ。
/// </summary>
/// <param name="name"></param>
private void CallHelloWorldGetMessage(string name)
{
    // サービス参照の追加で生成したプロキシクラスのインスタンスを生成する。
    HelloWorldServiceClient client = new HelloWorldServiceClient();

    // WCFコール終了後に発生するイベントにイベントハンドラを登録する。
    client.GetMessageCompleted += new EventHandler<GetMessageCompletedEventArgs>(this.Client_GetMessageCompleted);

    // GetMessageを呼ぶ。
    client.GetMessageAsync(name);
}

/// <summary>
/// WCFからの戻り値を処理する。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Client_GetMessageCompleted(object sender, GetMessageCompletedEventArgs e)
{
    // 正常にWCF呼び出しが行われたか?
    if (e.Cancelled == false && e.Error == null)
    {
        // 結果をTextBlockにセットする。
        string result = e.Result;
        TblResult.Text = result;
    }
    else if (e.Error != null)
    {
        // エラー内容を表示する。
        MessageBox.Show(e.Error.Message);
    }
}

以上で、WCFコールの実装は完了です。