方法 : コードを使用してサービスのメタデータを公開する

これは、Windows Communication Foundation (WCF) サービスのメタデータの公開方法を説明する 2 つの「方法」トピックの 1 つです。構成ファイルとコードを使用して、サービスがメタデータを公開する手段を指定する方法は 2 つあります。このトピックでは、コードを使用してサービスのメタデータを公開する方法について説明します。

Aa738489.Caution(ja-jp,VS.100).gif注意 :
このトピックでは、セキュリティで保護されていない方法でメタデータを公開する方法について説明します。クライアントは、サービスからメタデータを取得できます。セキュリティで保護された方法でメタデータを公開するサービスが必要な場合は、「カスタム セキュア メタデータ エンドポイント」を参照してください。

構成ファイル内の公開メタデータ詳細情報、「方法 : 構成ファイルを使用してサービスのメタデータを公開する」を参照してください。メタデータを公開すると、クライアントが ?wsdl クエリ文字列を使用した WS-Transfer GET 要求または HTTP/GET 要求によりメタデータを取得できるようになります。コードを機能させるには、基本的な WCF サービスを作成する必要があります。次のコードは基本的な自己ホスト型サービスの例です。

Imports System
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Description

<ServiceContract()> _
Public Interface ISimpleService
    <OperationContract()> _
    Function SimpleMethod(ByVal msg As String) As String
End Interface

Class SimpleService
    Implements ISimpleService

    Public Function SimpleMethod(ByVal msg As String) As String Implements ISimpleService.SimpleMethod
        Console.WriteLine("The caller passed in " + msg)
        Return "Hello " + msg
    End Function
End Class
using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Metadata.Samples
{
    [ServiceContract]
    public interface ISimpleService
    {
        [OperationContract]
        string SimpleMethod(string msg);
    }

    class SimpleService : ISimpleService
    {
        public string SimpleMethod(string msg)
        {
            Console.WriteLine("The caller passed in " + msg);
            return "Hello " + msg;
        }
    }

コードでメタデータを公開するには

  1. コンソール アプリケーションのメイン メソッド内で、サービス型とベース アドレスを渡して ServiceHost オブジェクトをインスタンス化します。

    Dim svcHost As New ServiceHost(GetType(SimpleService), New Uri("https://localhost:8001/MetadataSample"))
    
    ServiceHost svcHost = new ServiceHost(typeof(SimpleService), new Uri("https://localhost:8001/MetadataSample"));
    
  2. 手順 1. のコードのすぐ下に try ブロックを作成します。これにより、サービスの実行中にスローされる例外がすべてキャッチされます。

    Try
    
    try
    {
    
    Catch commProblem As CommunicationException
    
        Console.WriteLine("There was a communication problem. " + commProblem.Message)
        Console.Read()
    End Try
    
    }
    catch (CommunicationException commProblem)
    {
        Console.WriteLine("There was a communication problem. " + commProblem.Message);
        Console.Read();
    }
    
  3. サービス ホストに ServiceMetadataBehavior が含まれているかどうかを確認し、含まれていない場合は、新しい ServiceMetadataBehavior インスタンスを作成します。

    'Check to see if the service host already has a ServiceMetadataBehavior
    Dim smb As ServiceMetadataBehavior = svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)()
    'If not, add one
    If (smb Is Nothing) Then
        smb = New ServiceMetadataBehavior()
    End If
    
    // Check to see if the service host already has a ServiceMetadataBehavior
    ServiceMetadataBehavior smb = svcHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
    // If not, add one
    if (smb == null)
        smb = new ServiceMetadataBehavior();
    
  4. HttpGetEnabled プロパティを true. に設定します。

    smb.HttpGetEnabled = True
    
    smb.HttpGetEnabled = true;
    
  5. ServiceMetadataBehavior には MetadataExporter プロパティが含まれています。MetadataExporter には PolicyVersion プロパティが含まれています。PolicyVersion プロパティの値を Policy15 に設定します。PolicyVersion プロパティを Policy12 に設定することもできます。Policy15 に設定すると、WS-Policy 1.5 に準拠したメタデータでポリシー情報がメタデータ エクスポーターによって生成されます。Policy12 に設定すると、WS-Policy 1.2 に準拠したポリシー情報がメタデータ エクスポーターによって生成されます。

    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
    
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    
  6. ServiceMetadataBehavior インスタンスをサービス ホストの動作コレクションに追加します。

    svcHost.Description.Behaviors.Add(smb)
    
    svcHost.Description.Behaviors.Add(smb);
    
  7. メタデータ交換エンドポイントをサービス ホストに追加します。

    'Add MEX endpoint
    svcHost.AddServiceEndpoint( _
          ServiceMetadataBehavior.MexContractName, _
          MetadataExchangeBindings.CreateMexHttpBinding(), _
          "mex")
    
    // Add MEX endpoint
    svcHost.AddServiceEndpoint(
      ServiceMetadataBehavior.MexContractName,
      MetadataExchangeBindings.CreateMexHttpBinding(),
      "mex"
    );
    
  8. アプリケーション エンドポイントをサービス ホストに追加します。

    'Add application endpoint
    svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
    
    // Add application endpoint
    svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
    
    Aa738489.note(ja-jp,VS.100).gif注 :
    エンドポイントをサービスに追加しない場合、ランタイムによって既定のエンドポイントが追加されます。この例では、サービスには true に設定された ServiceMetadataBehavior があるので、サービスで公開メタデータも有効化されています。既定のエンドポイント詳細情報、「簡略化された構成」および「WCF サービスの簡略化された構成」を参照してください。

  9. サービス ホストを開き、受信呼び出しを待ちます。ユーザーが Enter キーを押すと、サービス ホストが終了します。

    'Open the service host to accept incoming calls
    svcHost.Open()
    
    'The service can now be accessed.
    Console.WriteLine("The service is ready.")
    Console.WriteLine("Press <ENTER> to terminate service.")
    Console.WriteLine()
    Console.ReadLine()
    
    'Close the ServiceHostBase to shutdown the service.
    svcHost.Close()
    
    // Open the service host to accept incoming calls
    svcHost.Open();
    
    // The service can now be accessed.
    Console.WriteLine("The service is ready.");
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.WriteLine();
    Console.ReadLine();
    
    // Close the ServiceHostBase to shutdown the service.
    svcHost.Close();
    
  10. コンソール アプリケーションのビルドと実行

  11. Internet Explorer を使用してサービスのベース アドレス (この例では、https://localhost:8001/MetadataSample) を参照し、メタデータの公開が有効になっていることを確認します。上部の "サービスを作成しました" のすぐ下に "Simple Service" と表示された Web ページが表示されます。有効になっていない場合は、"このサービスのメタデータ公開は現在は無効になっています。" というメッセージが結果ページの上部に表示されます。

次のコード例は、コードを使用してサービスのメタデータを公開する基本的な WCF サービスの実装を示しています。

Imports System
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Description

<ServiceContract()> _
Public Interface ISimpleService
    <OperationContract()> _
    Function SimpleMethod(ByVal msg As String) As String
End Interface

Class SimpleService
    Implements ISimpleService

    Public Function SimpleMethod(ByVal msg As String) As String Implements ISimpleService.SimpleMethod
        Console.WriteLine("The caller passed in " + msg)
        Return "Hello " + msg
    End Function
End Class

Module Module1

    Sub Main()
        Dim svcHost As New ServiceHost(GetType(SimpleService), New Uri("https://localhost:8001/MetadataSample"))
        Try
            'Check to see if the service host already has a ServiceMetadataBehavior
            Dim smb As ServiceMetadataBehavior = svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)()
            'If not, add one
            If (smb Is Nothing) Then
                smb = New ServiceMetadataBehavior()
            End If
            smb.HttpGetEnabled = True
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
            svcHost.Description.Behaviors.Add(smb)
            'Add MEX endpoint
            svcHost.AddServiceEndpoint( _
                  ServiceMetadataBehavior.MexContractName, _
                  MetadataExchangeBindings.CreateMexHttpBinding(), _
                  "mex")
            'Add application endpoint
            svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
            'Open the service host to accept incoming calls
            svcHost.Open()

            'The service can now be accessed.
            Console.WriteLine("The service is ready.")
            Console.WriteLine("Press <ENTER> to terminate service.")
            Console.WriteLine()
            Console.ReadLine()

            'Close the ServiceHostBase to shutdown the service.
            svcHost.Close()
        Catch commProblem As CommunicationException

            Console.WriteLine("There was a communication problem. " + commProblem.Message)
            Console.Read()
        End Try
    End Sub
End Module
using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Metadata.Samples
{
    [ServiceContract]
    public interface ISimpleService
    {
        [OperationContract]
        string SimpleMethod(string msg);
    }

    class SimpleService : ISimpleService
    {
        public string SimpleMethod(string msg)
        {
            Console.WriteLine("The caller passed in " + msg);
            return "Hello " + msg;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost svcHost = new ServiceHost(typeof(SimpleService), new Uri("https://localhost:8001/MetadataSample"));
            try
            {
                // Check to see if the service host already has a ServiceMetadataBehavior
                ServiceMetadataBehavior smb = svcHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
                // If not, add one
                if (smb == null)
                    smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                svcHost.Description.Behaviors.Add(smb);
                // Add MEX endpoint
                svcHost.AddServiceEndpoint(
                  ServiceMetadataBehavior.MexContractName,
                  MetadataExchangeBindings.CreateMexHttpBinding(),
                  "mex"
                );
                // Add application endpoint
                svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
                // Open the service host to accept incoming calls
                svcHost.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                svcHost.Close();
            }
            catch (CommunicationException commProblem)
            {
                Console.WriteLine("There was a communication problem. " + commProblem.Message);
                Console.Read();
            }
        }
    }
}

参照

処理手順

方法 : マネージ アプリケーションで WCF サービスをホストする
自己ホスト
方法 : 構成ファイルを使用してサービスのメタデータを公開する

概念

メタデータ アーキテクチャの概要
メタデータを使用する