書籍転載
Windows Azure 実践クラウド・プログラミング
for C#/Visual Basic/PHP

Windows Azure Platform AppFabricによるオンプレミス−クラウド連携
― Chapter 6 Azureアプリケーションの拡張と運用(後編) ―

山田 祥寛
2010/10/25
Page1 Page2 Page3

Azure AppFabric経由のサービスアクセス(クラウド環境)

 サービスバスにサービスが登録(公開)できたところで、続いてサービスにアクセスするためのクライアントアプリケーションを作成しましょう。先述したように、今回はオンプレミス(AppFabricOnPremiseプロジェクト)で公開したサービスに対して、クラウド環境(CloudUIロール)からアクセスすることにします。

 ということで、以降の操作はこれまで利用してきたCloudUIロールプロジェクトに対して行うようにしてください。

[1]参照を追加する

 Azure AppFabric、WCFサービス、Entity Frameworkを利用するために、[参照の追加]ダイアログから、

  • Microsoft.ServiceBus.dll(Azure AppFabric)
  • System.ServiceModelアセンブリ(WCFサービス)
  • System.Data.Entity、System.Runtime.serialization、System.Security(Entity Framework)

への参照を追加しておきます。Microsoft.ServiceBus.dllは、「C:\Program Files\Windows Azure platform AppFabric SDK\V1.0\Assemblies\NET4.0」フォルダの配下に含まれています。また、Microsoft.ServiceBusアセンブリは、プロパティウィンドウから[ローカルコピー]をTrueに設定し、パッケージファイルにコピーされるようにしておきます*75

*75 現時点で、Azure環境にはMicrosoft.ServiceBus.dllが用意されていないためです。この設定を行っておかないと、クラウド環境で実行した時に例外が発生します。

図6-46:ローカルコピーを有効化

[2]サービスコントラクト/データモデルを追加する*76

 前項で作成したサービスコントラクト(IBookService.cs/IBookService.vb)をServicesフォルダに、データモデル(MyDB.Designer.cs)をModelsフォルダに、それぞれ追加します*77

*76 Visual Basicプロジェクトでは、代わりにAppFabricOnPremiseプロジェクトの「/bin/AppFabricOnPremise.dll」に対する参照を追加してください。
*77 Servicesフォルダはあらかじめ作成しておいてください。

 既存のファイルをプロジェクトに追加するには、対応するフォルダを右クリックし、表示されたコンテキストメニューから[追加]−[既存の項目...]を指定します。

図6-47:[既存項目の追加]ダイアログ

 [既存項目の追加]ダイアログでファイルを選択した後、[追加]−[リンクとして追加]ボタンをクリックしてください。ファイルそのものを追加しても構いませんが、サービス(AppFabricOnPremiseプロジェクト)でコントラクト/データモデルに変更があった場合にも、リンクとして追加しておけば、変更がそのまま反映されますので便利です。

[3]Azure AppFabric/WCFサービスのクライアント情報を定義する

 Azure AppFabricサービスバスを介してWCFサービスにアクセスするため、アプリケーション構成ファイル(Web.config)に対して、Azure AppFabricの基本情報、そして、WCFサービスを利用するための定義情報を追加します。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  ...中略...
  <appSettings>
    ...中略...
    <add key="ServiceNamespace" value="wings-project"/>
    <add key="IssuerName" value="owner"/>
    <add key="IssuerSecret" value="xxxxxxxxxxxxxxxxxxxxxxxxx" />
  </appSettings>
  ...中略...
  <system.serviceModel>
    <client>
      <endpoint name="FabricEndpoint" binding="netTcpBinding"
        contract="AppFabricOnPremise.Services.IBookContract" />
    </client>
  </system.serviceModel>
</configuration>
リスト6-36 Azure AppFabric/WCFサービスの定義情報(Web.config)

 <appSettings>要素は、リスト6-34と同じです。

 <system.serviceModel>−<client>要素は、クライアントアプリケーションから接続可能なエンドポイントの一覧を定義します。ここでは最低限、<endpoint>要素に表6-19の属性を追加しておきましょう。

属性 概要
name エンドポイント名(識別のための任意の名前)
binding バインディングの種類
contract 使用するサービスコントラクト(「名前空間.インターフェイス名」の形式)
表6-19 <endpoint>要素の属性

 contract属性の値は、サービス側での設定値と対応関係にある必要があります。binding属性も本来は、サービス側と一致している必要があるのですが、現在、Azure環境でnetTcpRelayBindingが認識できないようです。ここでは仮にnetTcpBindingをセットし、あとからアプリケーション側で改めてバインディング設定を行います。

[4]ページをデザインする

 サービス利用の準備ができたところで、クライアントアプリケーションのユーザインターフェイスを作成します。以下は、新規に作成したAppFabricClient.aspxのフォームレイアウトと、サーバコントロールのプロパティ設定です。

図6-48:AppFabricClient.aspxのフォームレイアウト

コントロール プロパティ 設定値
DropDownList(ddlPublish) AutoPostBack True
Items 秀和システム/翔泳社/日経BPソフトプレス/インプレスジャパン
GridView(gridBook) (オートフォーマット) シンプル
表6-20 AppFabricClient.aspxのプロパティ設定

[5]サービスにアクセスする

 最後に、Azure AppFabric経由でサービスにアクセスするためのコードを記述します。

using System;
using System.Configuration;
using System.ServiceModel;
using Microsoft.ServiceBus;
using AppFabricOnPremise.Services;

namespace CloudUI.Chap6
{

  public partial class AppFabricClient : System.Web.UI.Page
  {
    // Azure AppFabric経由でBookServiceサービスにアクセス
    protected void Page_Load(object sender, EventArgs e)
    {
     
      // エンドポイント(URI)を生成
      var address = ServiceBusEnvironment.CreateServiceUri(
        "sb",
        ConfigurationManager.AppSettings["ServiceNamespace"],
        "BookService"
      );

      // エンドポイントの資格情報を定義
      var cred = new TransportClientEndpointBehavior();
      cred.CredentialType = TransportClientCredentialType.SharedSecret;
      cred.Credentials.SharedSecret.IssuerName =
        ConfigurationManager.AppSettings["IssuerName"];
      cred.Credentials.SharedSecret.IssuerSecret =
        ConfigurationManager.AppSettings["IssuerSecret"];

     
      // サービスアクセスのためのチャネルを取得
     
      var factory = new ChannelFactory<IBookChannel>(
        "FabricEndpoint", new EndpointAddress(address));
      factory.Endpoint.Binding = new NetTcpRelayBinding();
      factory.Endpoint.Behaviors.Add(cred);
      IBookChannel channel = factory.CreateChannel();

      // チャネルをオープン&サービスを要求
      channel.Open();
      gridBook.DataSource = channel.GetBookInfoByPublish(
        ddlPublish.SelectedValue);
      gridBook.DataBind();

      // チャネルをクローズ
      channel.Close();
      factory.Close();
    }
  }

}
Imports Microsoft.ServiceBus
Imports System.ServiceModel
Imports AppFabricOnPremise.Services

Public Class AppFabricClient
    Inherits System.Web.UI.Page

  ' Azure AppFabric経由でBookServiceサービスにアクセス
  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

   
    'エンドポイント(URI)を生成
    Dim address = ServiceBusEnvironment.CreateServiceUri(
      "sb",
      ConfigurationManager.AppSettings("ServiceNamespace"),
      "BookService"
    )

    ' エンドポイントの資格情報を定義
    Dim cred = New TransportClientEndpointBehavior()
    cred.CredentialType = TransportClientCredentialType.SharedSecret
    cred.Credentials.SharedSecret.IssuerName =
      ConfigurationManager.AppSettings("IssuerName")
    cred.Credentials.SharedSecret.IssuerSecret =
      ConfigurationManager.AppSettings("IssuerSecret")

   
    ' サービスアクセスのためのチャネルを取得
   
    Dim factory = New ChannelFactory(Of IBookChannel)(
      "FabricEndpoint", New EndpointAddress(address))
    factory.Endpoint.Binding = New NetTcpRelayBinding()
    factory.Endpoint.Behaviors.Add(cred)
    Dim channel As IBookChannel = factory.CreateChannel()

    ' チャネルをオープン&サービスを要求
    channel.Open()
    gridBook.DataSource = channel.GetBookInfoByPublish(
      ddlPublish.SelectedValue)
    gridBook.DataBind()

    ' チャネルをクローズ
    channel.Close()
    factory.Close()
  End Sub

End Class
リスト6-37 サービスバスへのアクセス(上:AppFabricClient.aspx.cs、下:AppFabricClient.aspx.vb)

 リスト6-37の内容は、ほとんどがこれまでの復習です。特にの内容はサービス側と同一のコードで記述できますので、迷うところはないでしょう。

 の部分も「Chapter 4 Windows Azure ストレージ - テーブル/キュー/ドライブ編 -」の「補足:内部エンドポイントによるロール間通信」(今回の転載では割愛)で解説した内容がほとんどそのままです。ただし、チャネルファクトリの作成方法が異なります()。

ChannelFactory(string config, EndpointAddress address)
構文 ChannelFactory<TChannel>クラス(コンストラクタ)
 config:エンドポイントの設定名 address:エンドポイントのアドレス

 エンドポイントの名前は、先ほどアプリケーション構成ファイルで設定した名前(ここではFabricEndpoint)と対応関係にある必要があります。

 また、作成したチャネルファクトリに対して、Endpoint.Bindingプロパティでバインディングの設定を*78、Endpoint.Behaviors.Addメソッドで資格情報を関連付けておきます。

*78 これは、先ほど手順[3]で保留にしておいた設定です。

 チャネルファクトリが準備できてしまえば、あとはサービスで定義済みのGetBookInfoByPublishメソッドを呼び出し、その結果をGridViewコントロールにバインドするだけです。

[6]サービス/クライアントの動作を確認する

 以上で、サービス/クライアント双方の開発は完了です。サービス(AppFabricOnPremiseプロジェクト)→クライアント(CloudUIロール)の順で起動し、図6-41のような結果が得られることを確認してください。

 書籍『Windows Azure 実践クラウド・プログラミング for C#/Visual Basic/PHP』の部分転載は今回で最終回です。@ITで公開した部分は、「目次情報ページ」の各リンクから参照できます。end of article

 

 INDEX
  [書籍転載]Windows Azure 実践クラウド・プログラミング for C#/Visual Basic/PHP
  Windows Azure Platform AppFabricによるオンプレミス−クラウド連携
    1.サービスの実装と公開(オンプレミス環境)(1)
    2.サービスの実装と公開(オンプレミス環境)(2)
  3.Azure AppFabric経由のサービスアクセス(クラウド環境)

インデックス・ページヘ 「Windows Azure 実践クラウド・プログラミング for C#/Visual Basic/PHP」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間