方法: コードを使用してサービスのメタデータを公開するHow to: Publish Metadata for a Service Using Code

これは、Windows Communication Foundation (WCF) サービスのメタデータの公開について説明する2つの操作方法に関するトピックの1つです。This is one of two how-to topics that discuss publishing metadata for a Windows Communication Foundation (WCF) service. 構成ファイルとコードを使用して、サービスがメタデータを公開する手段を指定する方法は 2 つあります。There are two ways to specify how a service should publish metadata, using a configuration file and using code. このトピックでは、コードを使用してサービスのメタデータを公開する方法について説明します。This topic shows how to publish metadata for a service using a code.

注意事項

このトピックでは、セキュリティで保護されていない方法でメタデータを公開する方法について説明します。This topic shows how to publish metadata in an unsecure manner. クライアントは、サービスからメタデータを取得できます。Any client can retrieve the metadata from the service. セキュリティで保護された方法でメタデータを公開するサービスが必要な場合は、If you require your service to publish metadata in a secure manner. カスタムセキュアメタデータエンドポイント」を参照してください。see Custom Secure Metadata Endpoint.

構成ファイルでのメタデータの公開の詳細については、「方法:構成ファイルを使用して、サービスのメタデータを公開します。For more information about publishing metadata in a configuration file, see How to: Publish Metadata for a Service Using a Configuration File. メタデータを公開すると、クライアントが ?wsdl クエリ文字列を使用した WS-Transfer GET 要求または HTTP/GET 要求によりメタデータを取得できるようになります。Publishing metadata allows clients to retrieve the metadata using a WS-Transfer GET request or an HTTP/GET request using the ?wsdl query string. コードを機能させるには、基本的な WCF サービスを作成する必要があります。To be sure that the code is working you must create a basic WCF service. 次のコードは基本的な自己ホスト型サービスの例です。A basic self-hosted service is provided in the following code.

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;
        }
    }
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

コードでメタデータを公開するにはTo publish metadata in code

  1. コンソール アプリケーションのメイン メソッド内で、サービス型とベース アドレスを渡して ServiceHost オブジェクトをインスタンス化します。Within the main method of a console application, instantiate a ServiceHost object by passing in the service type and the base address.

    ServiceHost svcHost = new ServiceHost(typeof(SimpleService), new Uri("http://localhost:8001/MetadataSample"));
    
    Dim svcHost As New ServiceHost(GetType(SimpleService), New Uri("http://localhost:8001/MetadataSample"))
    
  2. 手順 1. のコードのすぐ下に try ブロックを作成します。これにより、サービスの実行中にスローされる例外がすべてキャッチされます。Create a try block immediately below the code for step 1, this catches any exceptions that get thrown while the service is running.

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

    // 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();
    
    '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
    
  4. HttpGetEnabled プロパティを true. に設定します。Set the HttpGetEnabled property to true.

    smb.HttpGetEnabled = true;
    
    smb.HttpGetEnabled = True
    
  5. ServiceMetadataBehavior には MetadataExporter プロパティが含まれています。The ServiceMetadataBehavior contains a MetadataExporter property. MetadataExporter には PolicyVersion プロパティが含まれています。The MetadataExporter contains a PolicyVersion property. PolicyVersion プロパティの値を Policy15 に設定します。Set the value of the PolicyVersion property to Policy15. PolicyVersion プロパティを Policy12 に設定することもできます。The PolicyVersion property can also be set to Policy12. Policy15設定すると、メタデータエクスポーターは、"ws-policy 1.5 に準拠したメタデータを使用してポリシー情報を生成します。When set to Policy15 the metadata exporter generates policy information with the metadata that" conforms to WS-Policy 1.5. Policy12 に設定すると、WS-Policy 1.2 に準拠したポリシー情報がメタデータ エクスポーターによって生成されます。When set to Policy12 the metadata exporter generates policy information that conforms to WS-Policy 1.2.

    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
    
  6. ServiceMetadataBehavior インスタンスをサービス ホストの動作コレクションに追加します。Add the ServiceMetadataBehavior instance to the service host's behaviors collection.

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

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

    // Add application endpoint
    svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
    
    'Add application endpoint
    svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
    

    注意

    エンドポイントをサービスに追加しない場合、ランタイムによって既定のエンドポイントが追加されます。If you do not add any endpoints to the service, the runtime adds default endpoints for you. この例では、サービスには ServiceMetadataBehavior に設定された true があるので、サービスで公開メタデータも有効化されています。In this example, because the service has a ServiceMetadataBehavior set to true, the service has publishing metadata enabled. 既定のエンドポイントの詳細については、「 WCF サービスの構成と簡略化された構成の簡略化」を参照してください。For more information about default endpoints, see Simplified Configuration and Simplified Configuration for WCF Services.

  9. サービス ホストを開き、受信呼び出しを待ちます。Open the service host and wait for incoming calls. ユーザーが Enter キーを押すと、サービス ホストが終了します。When the user presses ENTER, close the service host.

    // 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. コンソール アプリケーションのビルドと実行Build and run the console application.

  11. Internet Explorer を使用してサービスのベースアドレス (http://localhost:8001/MetadataSample このサンプルでは) を参照し、メタデータの公開が有効になっていることを確認します。Use Internet Explorer to browse to the base address of the service (http://localhost:8001/MetadataSample in this sample) and verify that the metadata publishing is turned on. 上部の "サービスを作成しました" のすぐ下に "Simple Service" と表示された Web ページが表示されます。You should see a Web page displayed that says "Simple Service" at the top and immediately below "You have created a service." それ以外の場合は、次のメッセージが表示されます。"このサービスのメタデータの公開は現在無効になっています。"If not, a message at the top of the resulting page displays: "Metadata publishing for this service is currently disabled."

Example

次のコード例は、コードでサービスのメタデータを公開する基本的な WCF サービスの実装を示しています。The following code example shows the implementation of a basic WCF service that publishes metadata for the service in code.

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("http://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();
            }
        }
    }
}
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("http://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

関連項目See also