方法 : 基本的な Windows Communication Foundation サービスをホストおよび実行する

これは、基本的な Windows Communication Foundation (WCF) サービスと、そのサービスを呼び出すことができるクライアントの作成に必要な 6 つのタスクのうち、3 番目のタスクです。6 つのすべてのタスクの概要については、「チュートリアル入門」を参照してください。

ここでは基本的な Windows Communication Foundation (WCF) サービスを実行する方法を説明します。この操作は、次の手順から構成されます。

  • サービスのベース アドレスを作成します。

  • サービスのサービス ホストを作成します。

  • メタデータ交換を有効にします。

  • サービス ホストを開きます。

このタスクで書かれるコードの全容は手順に続いて提供されている例で見ることができます。Program クラスに定義されている Main() メソッド内に次のコードを追加します。このクラスは Service ソリューションを作成したときに生成されたものです。

サービスのベース アドレスを構成するには

  1. サービスのベース アドレス用に Uri インスタンスを作成します。この URI は、HTTP スキーム、ローカル コンピューター、ポート番号 8000、およびサービスへのパスとして ServiceModelSample/Service を指定します。このパスは、サービス コントラクトでサービスの名前空間に指定されたものです。

    Dim baseAddress As New Uri("https://localhost:8000/ServiceModelSamples/Service")
    
    Uri baseAddress = new Uri("https://localhost:8000/ServiceModelSamples/Service");
    

サービスをホストするには

  1. System.ServiceModel.Description 名前空間をインポートします。このコード行は、using ステートメントまたは imports ステートメントの残りの部分と共に Program.cs/Program.vb ファイルの一番上に書き込まれている必要があります。

    Imports System.ServiceModel.Description
    
    using System.ServiceModel.Description;
    
  2. 新しい ServiceHost インスタンスを作成し、サービスをホストします。サービス コントラクトを実装する型とベース アドレスを指定する必要があります。この例では、ベース アドレスが https://localhost:8000/ServiceModelSamples/Service、サービス コントラクトを実装する型が CalculatorService になっています。

    Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
    
    ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    
  3. CommunicationException をキャッチする try-catch ステートメントを追加し、try ブロックに次の 3 つの手順のコードを追加します。catch 句はエラー メッセージを表示してから selfHost.Abort() を呼び出す必要があります。

    Try
        ' ...
    Catch ce As CommunicationException
        Console.WriteLine("An exception occurred: {0}", ce.Message)
        selfHost.Abort()
    End Try
    
    try
    {
        // ...
    }
    catch (CommunicationException ce)
    {
        Console.WriteLine("An exception occurred: {0}", ce.Message);
        selfHost.Abort();
    }
    
  4. サービスを公開するエンドポイントを追加します。これを行うには、エンドポイントが公開するコントラクト、バインディング、エンドポイントのアドレスを指定する必要があります。この例では、コントラクトとして ICalculator を、バインディングとして WSHttpBinding を、アドレスとして CalculatorService をそれぞれ指定します。ここでは、エンドポイントのアドレスが相対アドレスになっていることに注意してください。エンドポイントの完全なアドレスは、ベース アドレスとエンドポイントのアドレスを組み合わせたものです。この場合、完全なアドレスは https://localhost:8000/ServiceModelSamples/Service/CalculatorService になります。

    ' Add a service endpoint
    selfHost.AddServiceEndpoint( _
        GetType(ICalculator), _
        New WSHttpBinding(), _
        "CalculatorService")
    
    selfHost.AddServiceEndpoint(
        typeof(ICalculator),
        new WSHttpBinding(),
        "CalculatorService");
    
    ms730935.note(ja-jp,VS.100).gif注 :
    サービスに対してエンドポイントが明示的に構成されておらず、ServiceHost が開いているときにランタイムによって既定のエンドポイントが追加される場合は、.NET Framework 4 から開始します。この例ではエンドポイントを明示的に追加し、その方法の例を提供します。既定のエンドポイント、バインド、および動作詳細情報、「簡略化された構成」および「WCF サービスの簡略化された構成」を参照してください。

  5. メタデータ交換を有効にします。これを行うには、サービス メタデータの動作を追加します。まず、ServiceMetadataBehavior インスタンスを作成し、HttpGetEnabled プロパティを true に設定します。次に、新しい動作をサービスに追加します。メタデータ公開時のセキュリティ問題詳細情報、「Security Considerations with Metadata」を参照してください。

    ' Enable metadata exchange
    Dim smb As New ServiceMetadataBehavior()
    smb.HttpGetEnabled = True
    selfHost.Description.Behaviors.Add(smb)
    
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    selfHost.Description.Behaviors.Add(smb);
    
  6. ServiceHost を開き、受信メッセージを待ちます。ユーザーが Enter キーを押すと ServiceHost が終了します。

    selfHost.Open()
    Console.WriteLine("The service is ready.")
    Console.WriteLine("Press <ENTER> to terminate service.")
    Console.WriteLine()
    Console.ReadLine()
    
    ' Close the ServiceHostBase to shutdown the service.
    selfHost.Close()
    
    selfHost.Open();
    Console.WriteLine("The service is ready.");
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.WriteLine();
    Console.ReadLine();
    
    // Close the ServiceHostBase to shutdown the service.
    selfHost.Close();
    

サービスが正常に機能していることを確認するには

  1. service.exe を Visual Studio 内から実行します。Windows Vista 上で実行されるサービスには、管理者権限が必要です。Visual Studio は管理者権限で実行されているため、service.exe も管理者権限で実行される必要があります。新しいコマンド プロンプトを管理者権限で開いて、service.exe をその中で実行することもできます。

  2. Internet Explorer を開いて、サービスのデバッグ ページである https://localhost:8000/ServiceModelSamples/Service に移動します。

次の例では、チュートリアルの前の手順で作成したサービス コントラクトと実装を含め、コンソール アプリケーションでサービスをホストします。次のコードを Service.exe という名前の実行可能ファイルにコンパイルします。

コードのコンパイル時に、System.ServiceModel.dll が参照されることを確認してください。

Imports System
Imports System.ServiceModel
Imports System.ServiceModel.Description

Module Service
    ' Define a service contract.
    <ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
    Public Interface ICalculator
        <OperationContract()> _
        Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()> _
        Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()> _
        Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
        <OperationContract()> _
        Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
    End Interface

    ' Service class that implements the service contract.
    ' Added code to write output to the console window.
    Public Class CalculatorService
        Implements ICalculator
        Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
            Dim result As Double = n1 + n2
            Console.WriteLine("Received Add({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function

        Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
            Dim result As Double = n1 - n2
            Console.WriteLine("Received Subtract({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function

        Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
            Dim result As Double = n1 * n2
            Console.WriteLine("Received Multiply({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function

        Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
            Dim result As Double = n1 / n2
            Console.WriteLine("Received Divide({0},{1})", n1, n2)
            Console.WriteLine("Return: {0}", result)
            Return result
        End Function
    End Class

    Class Program
        Shared Sub Main()
            ' Step 1 of the address configuration procedure: Create a URI to serve as the base address.
            Dim baseAddress As New Uri("https://localhost:8000/ServiceModelSamples/Service")

            ' Step 2 of the hosting procedure: Create ServiceHost
            Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
            Try

                ' Step 3 of the hosting procedure: Add a service endpoint.
                ' Add a service endpoint
                selfHost.AddServiceEndpoint( _
                    GetType(ICalculator), _
                    New WSHttpBinding(), _
                    "CalculatorService")

                ' Step 4 of the hosting procedure: Enable metadata exchange.
                ' Enable metadata exchange
                Dim smb As New ServiceMetadataBehavior()
                smb.HttpGetEnabled = True
                selfHost.Description.Behaviors.Add(smb)

                ' Step 5 of the hosting procedure: Start (and then stop) the service.
                selfHost.Open()
                Console.WriteLine("The service is ready.")
                Console.WriteLine("Press <ENTER> to terminate service.")
                Console.WriteLine()
                Console.ReadLine()

                ' Close the ServiceHostBase to shutdown the service.
                selfHost.Close()
            Catch ce As CommunicationException
                Console.WriteLine("An exception occurred: {0}", ce.Message)
                selfHost.Abort()
            End Try
        End Sub
    End Class
using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Microsoft.ServiceModel.Samples
{
    // Define a service contract.
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }

    // Service class that implements the service contract.
    // Added code to write output to the console window.
    public class CalculatorService : ICalculator
    {
        public double Add(double n1, double n2)
        {
            double result = n1 + n2;
            Console.WriteLine("Received Add({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Subtract(double n1, double n2)
        {
            double result = n1 - n2;
            Console.WriteLine("Received Subtract({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Multiply(double n1, double n2)
        {
            double result = n1 * n2;
            Console.WriteLine("Received Multiply({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }

        public double Divide(double n1, double n2)
        {
            double result = n1 / n2;
            Console.WriteLine("Received Divide({0},{1})", n1, n2);
            Console.WriteLine("Return: {0}", result);
            return result;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

            // Step 1 of the address configuration procedure: Create a URI to serve as the base address.
            Uri baseAddress = new Uri("https://localhost:8000/ServiceModelSamples/Service");

            // Step 2 of the hosting procedure: Create ServiceHost
            ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);

            try
            {


                // Step 3 of the hosting procedure: Add a service endpoint.
                selfHost.AddServiceEndpoint(
                    typeof(ICalculator),
                    new WSHttpBinding(),
                    "CalculatorService");


                // Step 4 of the hosting procedure: Enable metadata exchange.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                selfHost.Description.Behaviors.Add(smb);

                // Step 5 of the hosting procedure: Start (and then stop) the service.
                selfHost.Open();
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                selfHost.Close();
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("An exception occurred: {0}", ce.Message);
                selfHost.Abort();
            }

        }
    }
}
ms730935.note(ja-jp,VS.100).gif注 :
このようなサービスには、リッスンを行うコンピューター上で HTTP アドレスを登録するためのアクセス許可が必要です。管理者アカウントにはこのアクセス許可がありますが、管理者以外のアカウントの場合は、HTTP 名前空間へのアクセス許可を付与する必要があります。名前空間予約の構成方法詳細情報、「HTTP および HTTPS の構成」を参照してください。Visual Studio での service.exe の実行には、管理者権限が必要です。

これでサービスが実行されていることが確認できました。「方法 : Windows Communication Foundation クライアントを作成する」に進んでください。トラブルシューティングの詳細については、「チュートリアル入門のトラブルシューティング」を参照してください。

参照

処理手順

入門サンプル
自己ホスト