方法: マネージド アプリで WCF サービスをホストする

マネージド アプリケーションでサービスをホストするには、マネージド アプリケーション コード内にサービスのコードを埋め込み、サービスのエンドポイントをコードで強制的に定義するか、構成を使用して宣言により定義してから、または既定のエンドポイントを使用して、ServiceHost のインスタンスを作成します。

メッセージの受信を開始するには、OpenServiceHost を呼び出します。 これにより、サービスのリスナーが作成されて開きます。 この方法によるサービスのホストは、マネージド アプリケーション自体がホスト作業を行うため、"自己ホスト" と呼ばれることがあります。 サービスを閉じるには、CommunicationObject.CloseServiceHost を呼び出します。

サービスは、マネージド Windows サービス、インターネット インフォメーション サービス (IIS)、または Windows プロセス アクティブ化サービス (WAS) でホストすることもできます。 サービスのホスティング オプションの詳細については、「ホスティング サービス」を参照してください。

マネージド アプリケーションでのサービスのホスティングは、展開するインフラストラクチャが最小限で済むため、最も柔軟性があります。 マネージド アプリケーションでのホスティング サービスの詳細については、「マネージド アプリケーションのホスト」を参照してください。

次の手順では、自己ホスト型サービスをコンソール アプリケーションに実装する方法を示します。

自己ホスト型サービスを作成する

  1. 新しいコンソール アプリケーションを作成します。

    1. Visual Studio を開き、 [ファイル] メニューから [新規]>[プロジェクト] を選択します。

    2. [インストール済みのテンプレート] の一覧で [Visual C#] または [Visual Basic] を選択し、 [Windows デスクトップ] を選択します。

    3. [コンソール アプリ] テンプレートを選択します。 [名前] ボックスに「SelfHost」と入力して、 [OK] を選択します。

  2. ソリューション エクスプローラーSelfHost を右クリックして、 [参照の追加] を選択します。 [.NET] タブで System.ServiceModel を選択して、 [OK] を選択します。

    ヒント

    [ソリューション エクスプローラー] ウィンドウが表示されない場合は、 [表示] メニューの [ソリューション エクスプローラー] を選択します。

  3. まだ開いていない場合は、ソリューション エクスプローラーProgram.cs または Module1.vb をダブルクリックして、コード ウィンドウで開きます。 ファイルの先頭に、次のステートメントを追加します。

    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
  4. サービス コントラクトを定義して実装します。 この例では、サービスへの入力に基づいてメッセージを返す HelloWorldService を定義します。

    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }
    
    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }
    
    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface
    
    Public Class HelloWorldService
        Implements IHelloWorldService
    
        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class
    

    Note

    サービス インターフェイスを定義して実装する方法の詳細については、サービス コントラクトの定義方法およびサービス コントラクトの実装方法に関する記事を参照してください。

  5. Main メソッドの上部で、サービスのベース アドレスで Uri クラスのインスタンスを作成します。

    Uri baseAddress = new Uri("http://localhost:8080/hello");
    
    Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
    
  6. ServiceHost クラスのインスタンスを作成して、サービス型を表す Type とベース アドレス URI (Uniform Resource Identifier) を ServiceHost(Type, Uri[]) に渡します。 メタデータ公開を有効にして、OpenServiceHost メソッドを呼び出し、サービスを初期化してメッセージを受信する準備をします。

    // Create the ServiceHost.
    using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
    {
        // Enable metadata publishing.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        host.Description.Behaviors.Add(smb);
    
        // Open the ServiceHost to start listening for messages. Since
        // no endpoints are explicitly configured, the runtime will create
        // one endpoint per base address for each service contract implemented
        // by the service.
        host.Open();
    
        Console.WriteLine("The service is ready at {0}", baseAddress);
        Console.WriteLine("Press <Enter> to stop the service.");
        Console.ReadLine();
    
        // Close the ServiceHost.
        host.Close();
    }
    
    ' Create the ServiceHost.
    Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)
    
        ' Enable metadata publishing.
        Dim smb As New ServiceMetadataBehavior()
        smb.HttpGetEnabled = True
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
        host.Description.Behaviors.Add(smb)
    
        ' Open the ServiceHost to start listening for messages. Since
        ' no endpoints are explicitly configured, the runtime will create
        ' one endpoint per base address for each service contract implemented
        ' by the service.
        host.Open()
    
        Console.WriteLine("The service is ready at {0}", baseAddress)
        Console.WriteLine("Press <Enter> to stop the service.")
        Console.ReadLine()
    
        ' Close the ServiceHost.
        host.Close()
    
    End Using
    

    Note

    この例では、既定のエンドポイントを使用するので、このサービスには構成ファイルは必要ありません。 エンドポイントが構成されていない場合、ランタイムは、サービスによって実装されたサービス コントラクトごとに 1 つのエンドポイントを各ベース アドレスに作成します。 既定のエンドポイントの詳細については、「簡易構成」と「WCF サービスの簡易構成」を参照してください。

  7. Ctrl+Shift+B キーを押して、ソリューションをビルドします。

サービスをテストする

  1. Ctrl+F5 キーを押してサービスを実行します。

  2. [WCF テスト クライアント] を開きます。

    ヒント

    [WCF テスト クライアント] を開くには、Visual Studio の開発者コマンド プロンプトを開き、WcfTestClient.exe を実行します。

  3. [ファイル] メニューの [サービスの追加] を選択します。

  4. アドレス ボックスに「http://localhost:8080/hello」と入力して、 [OK] をクリックします。

    ヒント

    サービスが実行していることを確認してください。サービスが実行していない場合、この手順は失敗します。 コードでベース アドレスを変更した場合は、この手順で、変更したアドレスを使用します。

  5. [マイ サービス プロジェクト] ノードの SayHello をダブルクリックします。 自分の名前を [要求] ボックスの [値] 列に入力して、 [起動] をクリックします。

    応答メッセージが [応答] の一覧に表示されます。

ServiceHost 型のサービスをホストする HelloWorldService オブジェクトを作成し、OpenServiceHost メソッドを呼び出す例を、次に示します。 ベース アドレスがコードで指定され、メタデータ公開が有効化されていて、既定のエンドポイントが使用されています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace SelfHost
{
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }

    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:8080/hello");

            // Create the ServiceHost.
            using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
            {
                // Enable metadata publishing.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                host.Description.Behaviors.Add(smb);

                // Open the ServiceHost to start listening for messages. Since
                // no endpoints are explicitly configured, the runtime will create
                // one endpoint per base address for each service contract implemented
                // by the service.
                host.Open();

                Console.WriteLine("The service is ready at {0}", baseAddress);
                Console.WriteLine("Press <Enter> to stop the service.");
                Console.ReadLine();

                // Close the ServiceHost.
                host.Close();
            }
        }
    }
}
Imports System.ServiceModel
Imports System.ServiceModel.Description

Module Module1

    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface

    Public Class HelloWorldService
        Implements IHelloWorldService

        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class

    Sub Main()
        Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")

        ' Create the ServiceHost.
        Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)

            ' Enable metadata publishing.
            Dim smb As New ServiceMetadataBehavior()
            smb.HttpGetEnabled = True
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
            host.Description.Behaviors.Add(smb)

            ' Open the ServiceHost to start listening for messages. Since
            ' no endpoints are explicitly configured, the runtime will create
            ' one endpoint per base address for each service contract implemented
            ' by the service.
            host.Open()

            Console.WriteLine("The service is ready at {0}", baseAddress)
            Console.WriteLine("Press <Enter> to stop the service.")
            Console.ReadLine()

            ' Close the ServiceHost.
            host.Close()

        End Using

    End Sub

End Module

関連項目