方法: 構成ファイルを使用してサービスのメタデータを公開するHow to: Publish Metadata for a Service Using a Configuration File

これは、Windows Communication Foundation (WCF) サービスのメタデータの公開を示す2つの操作方法に関するトピックの1つです。This is one of two how-to topics that demonstrate 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 configuration file.

注意事項

このトピックでは、セキュリティで保護されていない方法でメタデータを公開する方法について説明します。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 code, see How to: Publish Metadata for a Service Using Code. メタデータを公開すると、クライアントが ?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, create a basic WCF service. 簡略化のため、次のコードに基本的な自己ホスト型サービスが用意されています。For simplicity, 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;  
        }  
    }  
  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            ServiceHost host = new ServiceHost(typeof(SimpleService),  
                new Uri("http://localhost:8001/MetadataSample"));   
            try  
            {  
                // Open the service host to accept incoming calls  
                host.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.  
                host.Close();  
            }  
            catch (CommunicationException commProblem)  
            {  
                Console.WriteLine("There was a communication problem. " + commProblem.Message);  
                Console.Read();  
            }  
        }  
    }  
}  

これは、構成ファイルを使用して構成された自己ホスト型サービスです。This service is a self-hosted service, which is configured using a configuration file. 以下の構成ファイルをベースとして使用します。The following configuration file serves as a starting point.

<configuration>  
  <system.serviceModel>  
    <services>  
      <service name="Metadata.Example.SimpleService">  
        <endpoint address=""  
                  binding="basicHttpBinding"  
                  contract="Metadata.Example.ISimpleService" />  
      </service>  
    </services>  
    <behaviors>  
  
    </behaviors>  
  </system.serviceModel>  
</configuration>  

アプリケーション構成ファイルを使用して WCF サービスのメタデータを公開するにはTo publish metadata for a WCF service using an application configuration file

  1. </services> 要素を閉じた後、App.config ファイル内に <behaviors> 要素を作成します。Within the App.config file, after the closing </services> element, create a <behaviors> element.

  2. <behaviors> 要素内に <serviceBehaviors> 要素を追加します。Within the <behaviors> element, add a <serviceBehaviors> element.

  3. <behavior>要素に <serviceBehaviors> 要素を追加し、name 要素の <behavior> 属性に値を指定します。Add a <behavior> element to the <serviceBehaviors> element and specify a value for the name attribute of the <behavior> element.

  4. <serviceMetadata> 要素を <behavior> 要素に追加します。Add a <serviceMetadata> element to the <behavior> element. httpGetEnabled 属性を true に設定し、policyVersion 属性を Policy15 に設定します。Set the httpGetEnabled attribute to true and the policyVersion attribute to Policy15. httpGetEnabled により、サービスは HTTP GET 要求からのメタデータ要求に応答できるようになります。httpGetEnabled allows the service to respond to metadata requests made by an HTTP GET request. policyVersion は、サービスに対して、WS-Policy 1.5 準拠でメタデータを生成するように指示します。policyVersion tells the service to conform to WS-Policy 1.5 when generating metadata.

  5. 次のコード例に示すように、behaviorConfiguration 要素に <service> 属性を追加し、手順 1. で追加した name 要素の <behavior> 属性を指定します。Add a behaviorConfiguration attribute to the <service> element and specify the name attribute of the <behavior> element added in step 1, as shown in the following code example.

    <services>  
      <service  
          name="Metadata.Example.SimpleService"  
          behaviorConfiguration="SimpleServiceBehavior">  
        ...  
      </service>  
    </services>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="SimpleServiceBehavior">  
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    
  6. 1 つ以上の <endpoint> 要素を追加して、コントラクトを IMetadataExchange に設定します。コード例を次に示します。Add one or more <endpoint> elements with the contract set to IMetadataExchange, as shown in the following code example.

    <services>  
      <service  
          name="Metadata.Example.SimpleService"  
          behaviorConfiguration="SimpleServiceBehavior">  
    
        <endpoint address=""  
                  binding="wsHttpBinding"  
                  contract="Metadata.Example.ISimpleService" />  
    
        <endpoint address="mex"  
                  binding="mexHttpBinding"  
                  contract="IMetadataExchange" />  
      </service>  
    </services>  
    
  7. 前の手順で追加したメタデータ エンドポイントについて、binding 属性に次のいずれかの値を設定します。For the metadata endpoints added in the previous step, set the binding attribute to one of the following:

    • HTTP 公開の場合、mexHttpBindingmexHttpBinding for HTTP publication.

    • HTTPS 公開の場合、mexHttpsBindingmexHttpsBinding for HTTPS publication.

    • 名前付きパイプ公開の場合、mexNamedPipeBindingmexNamedPipeBinding for named pipe publication.

    • TCP 公開の場合、mexTcpBindingmexTcpBinding for TCP publication.

  8. 前の手順で追加したメタデータ エンドポイントについて、次のいずれかに等しいアドレスを設定します。For the metadata endpoints added in a previous step, set the address equal to:

    • ベース アドレスがメタデータ バインディングと同じ場合に、公開ポイントとしてホスト アプリケーションのベース アドレスを使用するための空の文字列An empty string to use the host application's base address as the publication point if the base address is the same as the metadata binding.

    • ホスト アプリケーションにベース アドレスがある場合、相対アドレスA relative address if the host application has a base address.

    • 絶対アドレスAn absolute address.

  9. コンソール アプリケーションのビルドと実行Build and run the console application.

  10. 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. それ以外の場合は、次のメッセージが表示されます。"このサービスのメタデータの公開は現在無効になっています。"If not, a message at the top of the resulting page displays: "Metadata publishing for this service is currently disabled."

既定のエンドポイントを使用するにはTo use default endpoints

  1. 既定のエンドポイントを使用するサービスでメタデータを構成するには、前の例のように、構成ファイルで ServiceMetadataBehavior を指定します。ただし、エンドポイントは指定しないでください。To configure metadata on a service that uses default endpoints, specify the ServiceMetadataBehavior in the configuration file as in the previous example, but do not specify any endpoints. 構成ファイルは、次のようになります。The configuration file would then look like this.

    <configuration>  
      <system.serviceModel>  
        <behaviors>  
          <serviceBehaviors>  
            <behavior name="SimpleServiceBehavior">  
              <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />  
            </behavior>  
          </serviceBehaviors>  
        </behaviors>  
    
      </system.serviceModel>  
    </configuration>  
    

    サービスの ServiceMetadataBehavior では httpGetEnabledtrue に設定されているため、サービスではメタデータの公開が有効になっています。また、エンドポイントが明示的に追加されていないため、ランタイムは既定のエンドポイントを追加します。Because the service has a ServiceMetadataBehavior with the httpGetEnabled set to true, the service has publishing metadata enabled, and because no endpoints were explicitly added, the runtime adds the default endpoints. 既定のエンドポイントについては、「Simplified Configuration」 (簡易構成) と「Simplified Configuration for WCF Services」 (WCF サービスの簡易構成) を参照してください。For more information about default endpoints, bindings, and behaviors, see Simplified Configuration and Simplified Configuration for WCF Services.

Example

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

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 host = new ServiceHost(typeof(SimpleService),  
                new Uri("http://localhost:8001/MetadataSample"));   
            try  
            {  
                // Open the service host to accept incoming calls  
                host.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.  
                host.Close();  
            }  
            catch (CommunicationException commProblem)  
            {  
                Console.WriteLine("There was a communication problem. " + commProblem.Message);  
                Console.Read();  
            }  
        }  
    }  
}  
<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="SimpleServiceBehavior">  
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />  
          <serviceDebug includeExceptionDetailInFaults="False" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
  </system.serviceModel>  
</configuration>  

関連項目See also