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

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

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

[5]Azure AppFabric/WCFサービスの公開情報を定義する

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

 デフォルトで<appSettings>/<system.serviceModel>要素は既に記述されていますので、リスト6-34の要領で編集してください。

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

 <appSettings>要素で定義しているのは、ServiceNamespace(サービスの名前空間)、IssuerName(発行者名)、IssuerSecret(シークレットキー)です。いずれもAppFabric管理画面(図6-39)で確認できる情報ですので、自分の登録情報に合わせて適宜編集してください。

 <system.serviceModel>−<services>−<service>要素は、WCFサービスの構成情報を表します。属性の意味は、以下の通りです。

<service>           サービスの設定
┣━ name           サービス名(「名前空間.クラス名」の形式)
┗━ <endpoint>     エンドポイントの情報
   ┣━ binding  バインディングの種類
   ┗━ contract 使用するサービスコントラクト(「名前空間.インターフェイス名」の形式)

 バインディングとは、サービスの提供方法のことです。netTcpRelayBindingはプロトコルとしてTCP/IPを利用するバインディングです。その他、WebHttpRelayBinding(RESTfull Webサービス)、WSHttpRelayBinding(Webサービス拡張仕様)、NetOnewayRelayBinding(片方向通信)、NetEventRelayBinding(マルチキャスト通信)などを指定できます。

[6]サービスを登録する

 サービス本体、定義情報を準備できたら、あとはこれをAzure AppFabricに登録するだけです。この手順は、Azure AppFabricを利用する上で、いわば定石とも言える部分ですので、きちんとおさえておきましょう。

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

namespace AppFabricOnPremise
{

  public class Global : System.Web.HttpApplication
  {
    private ServiceHost host; // サービスで使用されるホスト

    // アプリケーション起動時にサービスをAppFabricに登録
    protected void Application_Start(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 setting = new ServiceRegistrySettings(DiscoveryType.Public);

     
      // サービスホストを定義
      host = new ServiceHost(typeof(BookService), address);

     
      // エンドポイントの挙動として資格情報、公開の有無を追加
      foreach (var ep in host.Description.Endpoints)
      {
        ep.Behaviors.Add(cred);
        ep.Behaviors.Add(setting);
      }

     
      // サービスをオープン
      host.Open();
    }

    // アプリケーション終了時にサービスをクローズ
    protected void Application_End(object sender, EventArgs e)
    {
      host.Close();
    }
  }

}
Imports Microsoft.ServiceBus
Imports AppFabricOnPremise.Services

Public Class Global_asax
    Inherits System.Web.HttpApplication

  Private host As ServiceHost ' サービスで使用されるホスト

  ' アプリケーション起動時にサービスをAppFabricに登録
  Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)

   
   ' エンドポイント(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 setting = New ServiceRegistrySettings(DiscoveryType.Public)

   
    ' サービスホストを定義
    host = New ServiceHost(GetType(BookService), address)

   
    ' エンドポイントの挙動として資格情報、公開の有無を追加
    For Each ep In host.Description.Endpoints
      ep.Behaviors.Add(cred)
      ep.Behaviors.Add(setting)
    Next

   
    ' サービスをオープン
    host.Open()
  End Sub

 ' アプリケーション終了時にサービスをクローズ
  Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
    host.Close()
  End Sub

End Class
リスト6-35 WCFサービスの登録(上:Global.asax.cs、下:Global.asax.vb)

 複雑に見えるかもしれませんが、サービスバス登録の手続きはごく定型的です。

エンドポイント(URI)を生成する

 サービスバスでのエンドポイント(公開する仮想URI)を生成するのは、ServiceBusEnvironmentクラス(Microsoft.ServiceBus名前空間)のCreateServiceUriメソッドの役割です。

static Uri CreateServiceUri (string scheme, string solution, string service)
構文 CreateServiceUriメソッド
 scheme:URIのスキーマ solution:サービスの名前空間
 service:サービスパス

 引数schemeは、サービスバスを利用する場合はsbで固定です。引数solutionには先ほどアプリケーション構成ファイルに登録した値を、引数serviceにはサービスを識別するための一意な名前を、それぞれ指定します。

 CreateServiceUriメソッドの結果、

sb://wings-project.servicebus.windows.net/BookService

のような、サービスを特定するための仮想的なURIが生成されます。

エンドポイントの資格情報を定義する

 エンドポイントの挙動全般を表すのは、TransportClientEndpointBehaviorクラス(Microsoft.ServiceBus名前空間)です。ここでは、そのCredentialType(認証方法)プロパティ、Credentials(資格情報)プロパティを設定しています。

 CredentialTypeプロパティに設定可能な値は、以下の通りです。

設定値 概要
Saml SAML(Security Assertion Markup Language*72)による認証
SharedSecret シークレットキーによる認証
SimpleWebToken SWT(Simple Web Token*73)による認証
Unauthenticated 認証を利用しない
表6-18 認証の方法(TransportClientCredentialType列挙体のメンバ)

*72 標準化団体OASISによって策定された認証情報交換のためのしくみ。XMLをベースとしており、プロトコルとしてはHTTP、SOAPが利用されます。http://saml.xml.org/
*73 Open Web Foundationによって策定された認証方式。テキストフォーマットを利用しており、RESTによるアクセスが基本です。http://oauth-wrap-wg.googlegroups.com/web/SWT-v0.9.5.1.pdf

 ここではSharedSecretを選択していますので、Credentials.SharedSecretプロパティからシークレットキー認証に必要となるIssuerName(発行者)/IssuerSecret(シークレットキー)サブプロパティを設定しておきます。これらの情報は、いずれも手順[5]でアプリケーション構成ファイルに登録したものです。

 また、サービスの登録情報(ServiceRegistrySettingsクラス)も用意しておきます。

ServiceRegistrySettings(DiscoveryType type)
構文 ServiceRegistrySettingsクラス(コンストラクタ)
 type:エンドポイントを公開するか

 引数typeには、エンドポイントを外部に公開するか(Public)、それとも非公開(Private)とするかを指定します。

サービスホストを定義する

 WCFサービスのホストを表すのは、ServiceHostクラス(System.ServiceModel名前空間)です。コンストラクタでサービス本体(BookServiceクラス)と、で生成したエンドポイントを関連付けます。

ServiceHost(Type service, params Uri[] base)
構文 ServiceHostクラス(コンストラクタ)
 service:ホストされるサービス base:サービスのエンドポイント

エンドポイントの挙動を定義する

 ホストに登録済みのエンドポイントは、ServiceHostオブジェクトのDescription.Endpointsプロパティで取得できます。では、そのBehaviorsプロパティを介して、エンドポイントの挙動を追加しています。

 具体的には、で作成した資格情報と公開情報を、それぞれAddメソッドで追加しています。

ホストをオープンする

 以上でサービスバスへの登録は完了ですので、最後にOpenメソッドでサービスを開始します。

[7]サービスバスへの登録状況を確認する

 AppFabricOnPremiseプロジェクトをデバッグ実行し、特にエラーも出ずにインデックスページが表示されることを確認してください*74。この状態で、Azure AppFabricのポータルページ(管理画面)を開きます。

*74 ただし、イントラネット環境などではAzure AppFabricに接続できずにエラーとなる場合もあります。その場合は、Azure AppFabricに接続できる環境でリトライしてください。

図6-44:Azure AppFabric管理画面

図6-45:サービスバスの登録情報

 [Service Bus]欄−[Registry URL]からリンク(URL)をクリックすると、図6-45のようなサービス一覧が表示されます。AppFabricOnPremiseプロジェクトで登録したbookservice(すべて小文字)が表示されていれば、サービスの登録は成功しています。


 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 記事ランキング

本日 月間