クライアントプログラム
サービスプログラムの動作が確認できたところ、クライアントプログラムの解説をしていきます。リスト6がクライアントプログラムです(サンプル説明のため例外処理は省略しています)。
// サービス向けURIの生成
Uri address = ServiceBusEnvironment.CreateServiceUri(schema, *1
serviceNamespace,
servicePath);
var channelFactory = new ChannelFactory<IEchoChannel>("ServiceBusEndpoint", *2
new EndpointAddress(address));
// チャネルの作成
IEchoChannel channel = channelFactory.CreateChannel(); *3
// チャネルのオープン
channel.Open();
Console.WriteLine("テキストを入力してください([Enter]で終了) : ");
string input = Console.ReadLine();
while (input != String.Empty)
{
Console.WriteLine("返却値 : {0}", channel.Echo(input)); *4
Console.WriteLine("エラー " + e.Message);
input = Console.ReadLine();
}
channel.Close();
channelFactory.Close();
*1は、サービス提供側と同じく、AppFabricサービスバスのアドレスを生成しています。*2は、サービスバスのアドレスを指定し、チャネルファクトリーを生成します。さらに、*3でチャネルを生成し、オープンをします。これにより、サービスを利用する準備が整います。
*4は、チャネルを元に、サービス側のEcho操作を呼び出し、結果をコンソールに表示します。
リスト7が、クライアントプログラム側のアプリケーション構成ファイルです。
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="schema" value="sb"/>
<add key="namespace" value="sb-sample"/>
<add key="path" value="sample"/>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<system.serviceModel>
<extensions>
<!-- サービスバスの構成設定 --> *1
</extensions>
<!-- クライアントエンドポイントの定義 -->
<client>
<endpoint name="ServiceBusEndpoint" *2
contract="OnPremiseService.IEchoService"
binding="netTcpRelayBinding"
behaviorConfiguration="EndpointBehavior"/>
</client>
<behaviors> *3
<endpointBehaviors>
<behavior name="EndpointBehavior">
<transportClientEndpointBehavior credentialType="SharedSecret">
<clientCredentials>
<sharedSecret issuerName="owner"
issuerSecret="<<既定のキー>>"/>
</clientCredentials>
</transportClientEndpointBehavior>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
*1は、サービスプログラムと同様にサービスバスの構成設定を追加します。
*2は、client要素で、クライアントのエンドポイント定義です。サービス側と同じく、コントラクト、バインディングを指定します。
*3は、behavior要素で、エンドポイントのビヘイビアを定義します。サービス側と同じく、サービスを利用するための認証情報を指定します。
クライアント側のプログラム方法についても、WCFと変わるところはありません。これで、サービスとクライアントの準備が整いました。
実行
サービス提供側とクライアント側を実行してみましょう。クライアント側で入力したメッセージがサービス側に表示された後に、クライアント側でも表示されればAppFabricサービスバスを介してメッセージ中継が成功しています(図8)。
Webロールからの利用
前節では、お互いをオンプレミスに見立てたコンソールプログラムから接続を確認しましたが、ここでは、オンプレミスから登録したサービスにWebロールから接続してみます。基本的にクライアントから接続する場合と変わりはありませんが、いくつはWindows Azure固有の準備を実施しておく必要があります。以下にポイントとなる手順を解説します。
アセンブリの準備
Windows AzureゲストOSには、Microsoft.ServiceBusアセンブリはインストールされていません。[参照設定]-[Microsoft.ServiceBus]を選択し、プロパティから、ローカルコピーを「True」に設定してください(図9)。一般的に、利用者が用意したアセンブリはローカルコピーを「True」にして配置する必要があります。
ゲストOSの構成変更
SDK 1.5を利用している場合には、クライアントプログラムと同じく、Web.configファイルにサービスバスの構成設定が必要です。
また、SDK 1.0を利用している場合には、マシン構成ファイルへの設定が必要であるため、スタートアップタスクでRelayConfigurationInstaller.exeを構成する必要があります。
ただし、Web.configを使わずに、すべてコードでクライアントをプログラミングするような場合は、この構成変更を実施する必要はありません。
実行
それでは、Windows Azureにデプロイして実行してみましょう。メッセージにテキストを入力して[送信]ボタンを押してください。サービス側にメッセージが表示されたのち、ブラウザにも返信メッセージが表示されれば、正しく動作しています(図10)。
まとめ
少しでもAppFabricサービスバスの感触をつかめたでしょうか。WCFをベースとしているため、WCF未経験者にとっては少々取っ付きにくいかもしれません。
ここで紹介した接続方法は、ほんの一例に過ぎません。WCFを含む、強力な.NET Framework基盤とAppFabricサービスバスを組み合わせることによって、オンプレミスとクラウド間のシステム連携の可能性が広がるでしょう。


