チュートリアル: 基本的な Windows Communication Foundation サービスをホストおよび実行する
このチュートリアルでは、基本的な Windows Communication Foundation (WCF) アプリケーションの作成に必要な 5 つのタスクのうち 3 番目のタスクについて説明します。 このチュートリアルの概要については、「チュートリアル: Windows Communication Foundation アプリケーション入門」を参照してください。
WCF アプリケーションを作成するための次のタスクは、コンソール アプリケーションで WCF サービスをホストすることです。 WCF サービスにより 1 つ以上の "エンドポイント" が公開され、そのそれぞれで 1 つ以上のサービス操作が公開されます。 サービス エンドポイントにより次の情報が指定されます。
- サービスを検索できるアドレス。
- クライアントがサービスと通信するために必要な方法を説明する情報が格納されているバインド。
- サービスからクライアントに提供される機能が定義されているコントラクト。
このチュートリアルでは、以下の内容を学習します。
- WCF サービスをホストするためのコンソール アプリ プロジェクトを作成して構成します。
- WCF サービスをホストするためのコードを追加します。
- 構成ファイルを更新します。
- WCF サービスを開始し、動作していることを確認します。
サービスをホストするためのコンソール アプリ プロジェクトを作成して構成する
Visual Studio でコンソール アプリ プロジェクトを作成します。
[ファイル] メニューから、 [開く]>[ソリューション/プロジェクト] を選択し、前に作成した GettingStarted ソリューション (GettingStarted.sln) を参照します。 [Open] を選択します。
[表示] メニューの [ソリューション エクスプローラー] を選択します。
[ソリューション エクスプローラー] ウィンドウで、GettingStarted ソリューション (最上位ノード) を選択し、ショートカット メニューの [追加]>[新しいプロジェクト] を選択します。
[新しいプロジェクトの追加] ウィンドウの左側で、 [Visual C#] または [Visual Basic] の下にある [Windows デスクトップ] カテゴリを選択します。
[コンソール アプリ (.NET Framework)] テンプレートを選択し、 [名前] に「GettingStartedHost」と入力します。 [OK] を選択します。
GettingStartedHost プロジェクトに GettingStartedLib プロジェクトへの参照を追加します。
[ソリューション エクスプローラー] ウィンドウで、GettingStartedHost プロジェクトの下にある [参照設定] フォルダーを選択して、ショートカット メニューから [参照の追加] を選択します。
[参照の追加] ダイアログ ボックスで、ウィンドウの左側にある [プロジェクト] の下の [ソリューション] を選択します。
ウィンドウの中央のセクションで GettingStartedLib を選択し、 [OK] を選択します。
これにより、GettingStartedLib プロジェクトで定義されている型を、GettingStartedHost プロジェクトで使用できるようになります。
GettingStartedHost プロジェクトで、System.ServiceModel アセンブリへの参照を追加します。
[ソリューション エクスプローラー] ウィンドウで、GettingStartedHost プロジェクトの下にある [参照設定] フォルダーを選択して、ショートカット メニューから [参照の追加] を選択します。
[参照の追加] ウィンドウの左側にある [アセンブリ] で、 [フレームワーク] を選択します。
System.ServiceModel を選択して、 [OK] を選択します。
[ファイル]>[すべて保存] を選択して、ソリューションを保存します。
サービスをホストするためのコードを追加する
サービスをホストするには、次の手順を実行するコードを追加します。
- ベース アドレスの URI を作成します。
- サービスをホストするためのクラス インスタンスを作成します。
- サービス エンドポイントを作成します。
- メタデータ交換を有効にします。
- 受信メッセージをリッスンするためのサービス ホストを開きます。
コードに次の変更を加えます。
GettingStartedHost プロジェクトの Program.cs または Module1.vb ファイルを開き、そのコードを次のコードで置き換えます。
using System; using System.ServiceModel; using System.ServiceModel.Description; using GettingStartedLib; namespace GettingStartedHost { class Program { static void Main(string[] args) { // Step 1: Create a URI to serve as the base address. Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/"); // Step 2: Create a ServiceHost instance. ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress); try { // Step 3: Add a service endpoint. selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService"); // Step 4: Enable metadata exchange. ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; selfHost.Description.Behaviors.Add(smb); // Step 5: Start the service. selfHost.Open(); Console.WriteLine("The service is ready."); // Close the ServiceHost to stop the service. Console.WriteLine("Press <Enter> to terminate the service."); Console.WriteLine(); Console.ReadLine(); selfHost.Close(); } catch (CommunicationException ce) { Console.WriteLine("An exception occurred: {0}", ce.Message); selfHost.Abort(); } } } }
Imports System.ServiceModel Imports System.ServiceModel.Description Imports GettingStartedLib.GettingStartedLib Module Service Class Program Shared Sub Main() ' Step 1: Create a URI to serve as the base address. Dim baseAddress As New Uri("http://localhost:8000/GettingStarted/") ' Step 2: Create a ServiceHost instance. Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress) Try ' Step 3: Add a service endpoint. selfHost.AddServiceEndpoint( _ GetType(ICalculator), _ New WSHttpBinding(), _ "CalculatorService") ' Step 4: Enable metadata exchange. Dim smb As New ServiceMetadataBehavior() smb.HttpGetEnabled = True selfHost.Description.Behaviors.Add(smb) ' Step 5: Start the service. selfHost.Open() Console.WriteLine("The service is ready.") ' Close the ServiceHost to stop the service. Console.WriteLine("Press <Enter> to terminate the service.") Console.WriteLine() Console.ReadLine() selfHost.Close() Catch ce As CommunicationException Console.WriteLine("An exception occurred: {0}", ce.Message) selfHost.Abort() End Try End Sub End Class End Module
このコードの動作については、「サービス ホスティング プログラムの手順」を参照してください。
プロジェクトのプロパティを更新します。
[ソリューション エクスプローラー] ウィンドウで、GettingStartedHost フォルダーを選択した後、ショートカット メニューの [プロパティ] を選択します。
GettingStartedHost のプロパティ ページで、 [アプリケーション] タブを選択します。
C# プロジェクトの場合は、 [スタートアップ オブジェクト] ボックスの一覧から GettingStartedHost.Program を選択します。
Visual Basic プロジェクトの場合は、 [スタートアップ オブジェクト] ボックスの一覧から Service.Program を選択します。
[ファイル] メニューから [すべて保存] を選択します。
サービスが機能していることを確認する
ソリューションをビルドし、Visual Studio 内から GettingStartedHost コンソール アプリケーションを実行します。
サービスは、管理者権限で実行する必要があります。 Visual Studio を管理者特権で開いたので、Visual Studio で GettingStartedHost を実行すると、アプリケーションも管理者特権で実行されます。 または、管理者として新しいコマンド プロンプトを開き (ショートカット メニューから [その他]>[管理者として実行] を選択)、その中で GettingStartedHost.exe を実行することもできます。
Web ブラウザーを開き、サービスのページ
http://localhost:8000/GettingStarted/
を参照します。Note
このようなサービスには、リッスンを行うコンピューター上で HTTP アドレスを登録するための適切なアクセス許可が必要です。 管理者アカウントにはこのアクセス許可がありますが、管理者以外のアカウントの場合は、HTTP 名前空間へのアクセス許可を付与する必要があります。 名前空間の予約を構成する方法については、「Configuring HTTP and HTTPS」 (HTTP と HTTPS を構成する) を参照してください。
サービス ホスティング プログラムの手順
サービスをホストするために追加したコードの手順は、次のように記述されています。
ステップ 1: サービスのベース アドレスを保持する
Uri
クラスのインスタンスを作成します。 ベース アドレスを含む URL には、サービスを識別するオプションの URI があります。 ベース アドレスの形式は次のとおりです:<transport>://<machine-name or domain><:optional port #>/<optional URI segment>
。 電卓サービスのベース アドレスには、HTTP トランスポート、localhost、ポート 8000、および URI セグメント "GettingStarted" が使用されます。ステップ 2: サービスをホストするために使用する ServiceHost クラスのインスタンスを作成します。 コンストラクターは、サービス コントラクトを実装するクラスの型と、サービスのベース アドレスの、2 つのパラメーターを受け取ります。
ステップ 3: ServiceEndpoint のインスタンスを作成します。 サービス エンドポイントは、アドレス、バインディング、およびサービス コントラクトから構成されます。 ServiceEndpoint コンストラクターは、サービス コントラクト インターフェイスの型、バインディング、およびアドレスで構成されます。 サービス コントラクトは、サービス型に定義および実装した
ICalculator
です。 このサンプルのバインディングは WSHttpBinding で、これは組み込みのバインディングであり、WS-* 仕様に準拠するエンドポイントに接続します。 WCF バインディングの詳細については、WCF バインディングの概要に関するページを参照してください。 エンドポイントを示すため、ベース アドレスにアドレスを追加します。 コードで、アドレスとして CalculatorService を指定し、エンドポイントの完全修飾アドレスとしてhttp://localhost:8000/GettingStarted/CalculatorService
を指定します。重要
.NET Framework バージョン 4 以降では、サービス エンドポイントの追加は省略可能です。 これらのバージョンの場合、コードまたは構成を追加しないと、WCF により、サービスで実装されているベース アドレスとコントラクトの組み合わせごとに、1 つの既定のエンドポイントが追加されます。 既定のエンドポイントの詳細については、「エンドポイント アドレスの指定」を参照してください。 既定のエンドポイントについては、「簡略化された構成」と「WCF サービスの簡略化された構成」を参照してください。
ステップ 4: メタデータ交換を有効にします。 サービス操作を呼び出すためのプロキシを生成するため、クライアントによりメタデータ交換が使用されます。 メタデータ交換を有効化するには、ServiceMetadataBehavior のインスタンスを作成し、その HttpGetEnabled プロパティを
true
に設定して、ServiceMetadataBehavior
オブジェクトを ServiceHost インスタンスの Behaviors コレクションに追加します。ステップ 5: 受信メッセージをリッスンするために ServiceHost を開きます。 アプリケーションは、Enter キーが押されるのを待機しています。 アプリケーションによって ServiceHost がインスタンス化された後、try/catch ブロックが実行されます。 ServiceHost によってスローされる例外を安全にキャッチする方法の詳細については、「close と abort を使用して WCF クライアントのリソースを解放する」を参照してください。
重要
WCF サービス ライブラリを追加すると、サービス ホストを開始することによりそれをデバッグしている場合は、Visual Studio によって自動的にホストされます。 競合を回避するため、Visual Studio によって WCF サービス ライブラリがホストされないようにすることができます。
- ソリューション エクスプローラーで GettingStartedLib プロジェクトを選択し、ショートカット メニューから [プロパティ] を選択します。
- [WCF オプション] を選択し、 [同じソリューション内での別のプロジェクトのデバッグ時に WCF サービス ホストを開始する] をオフにします。
次のステップ
このチュートリアルでは、以下の内容を学習しました。
- WCF サービスをホストするためのコンソール アプリ プロジェクトを作成して構成します。
- WCF サービスをホストするためのコードを追加します。
- 構成ファイルを更新します。
- WCF サービスを開始し、動作していることを確認します。
次のチュートリアルに進み、WCF クライアントを作成する方法を学習してください。