Windows Communication Foundation サービスのバインディングの構成

アプリケーションの作成では、アプリケーションの配置後は各種決定事項を管理者に任せる場合がよくあります。たとえば、どのサービス アドレス (URI (Uniform Resource Identifier)) を使用するかなどの情報は、多くの場合、前もって知る方法がありません。アドレスをハードコーディングする代わりに、サービスの作成後に管理者が指定する方が便利です。構成を活用することで、この柔軟性が得られます。

ms733099.note(ja-jp,VS.100).gif注 :
構成ファイルをすばやく作成するには、/config スイッチを指定して ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を使用します。

主要なセクション

Windows Communication Foundation (WCF) 構成スキームは、3 つの主要なセクション (serviceModelbindings、および services) で構成されます。

<configuration>
    <system.serviceModel>
        <bindings>
        </bindings>
        <services>
        </services>
        <behaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

ServiceModel 要素

system.ServiceModel 要素によって囲まれたこのセクションを使用して、1 つ以上のエンドポイントを持つサービス型、およびサービスの設定を構成できます。各エンドポイントでは、アドレス、コントラクト、およびバインディングをそれぞれ 1 つずつ構成できます。エンドポイント詳細情報、「エンドポイントの作成の概要」を参照してください。エンドポイントを指定しない場合、ランタイムは、既定のエンドポイントを追加します。既定のエンドポイント、バインディング、および動作詳細情報、「簡略化された構成」および「WCF サービスの簡略化された構成」を参照してください。

バインディングはトランスポート (HTTP、TCP、パイプ、およびメッセージ キュー) とプロトコル (セキュリティ、信頼性、およびトランザクション フロー) を指定し、バインディング要素で構成されます。各バインディング要素は、エンドポイントの通信方法のさまざまな側面を指定します。

たとえば、basicHttpBinding 要素を指定すると、エンドポイントのトランスポートとして HTTP が使用されます。このエンドポイントを使用するサービスが開かれる実行時に、エンドポイントとの接続に HTTP が使用されます。

バインディングには、定義済みバインディングとカスタム バインディングの 2 種類があります。定義済みバインディングには、一般的なシナリオで使用される要素の組み合わせが含まれています。WCF で提供される定義済みバインディングの種類の一覧については、「システム標準のバインディング」を参照してください。定義済みバインディング コレクションに、サービス アプリケーションに必要な正しい機能の組み合わせがないときは、カスタム バインディングを作成して、そのアプリケーションの要件を満たすことができます。カスタム バインディング詳細情報、「<customBinding>」を参照してください。

次の 4 つの例は、WCF サービスの設定に使用される最も一般的なバインディング構成を示しています。

バインディングの種類を使用するエンドポイントの指定

最初の例は、アドレス、コントラクト、およびバインディングをそれぞれ 1 つずつ使用して構成されたエンドポイントを指定する方法を示しています。

<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
  <!—- This section is optional with the default configuration introduced
       in .NET Framework 4. -->
  <endpoint 
      address="/HelloWorld2/"
      contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
      binding="basicHttpBinding" />
  </endpoint>
</service>

この例では、name 属性は、構成がどのサービス型に対するものであるかを示します。HelloWorld コントラクトを使用してコードでサービスを作成すると、そのサービスは、この例の構成に定義されているすべてのエンドポイントと共に初期化されます。アセンブリにサービス コントラクトが 1 つしか実装されない場合、サービスは使用可能なタイプだけを使用するため、name 属性を省略できます。この属性が受け取る文字列は、Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null の形式で指定される必要があります。

address 属性では、他のエンドポイントがこのサービスと通信するために使用する URI を指定します。この URI は、絶対パスでも相対パスでもかまいません。相対アドレスを指定すると、ホストは、そのバインディングで使用されるトランスポート スキームに適したベース アドレスを提供します。アドレスが構成されていない場合、ベース アドレスはそのエンドポイントのアドレスと見なされます。

contract 属性では、このエンドポイントが公開するコントラクトを指定します。サービス実装の型は、コントラクト型を実装する必要があります。サービス実装が単一のコントラクト型を実装する場合は、このプロパティを省略できます。

binding 属性では、この特定のエンドポイントに使用される定義済みバインディングまたはカスタム バインディングを選択します。バインディングが明示的に選択されていないエンドポイントでは、既定のバインディング選択 (BasicHttpBinding) を使用します。

定義済みバインディングの変更

次の例では、定義済みバインディングを変更します。これにより、サービスの任意のエンドポイントを構成するために使用できるようになります。バインディングの変更では、ReceiveTimeout 値を 1 秒に設定します。このプロパティは、TimeSpan オブジェクトを返します。

変更されたバインディングは、バインディング セクションにあります。この変更したバインディングは、endpoint 要素の binding 属性を設定することにより、任意のエンドポイントを作成するときに使用できます。

ms733099.note(ja-jp,VS.100).gif注 :
バインディングに特定の名前を付ける場合、サービス エンドポイントで指定した bindingConfiguration と同じ名前にする必要があります。

<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
  <endpoint 
      address="/HelloWorld2/"
      contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
      binding="basicHttpBinding" />
  </endpoint>
</service>
<bindings>
    <basicHttpBinding 
        receiveTimeout="00:00:01"
    />
</bindings>

サービスに適用する動作の構成

次の例では、サービス型に対して、特定の動作を構成します。サービスに照会し、メタデータから Web サービス記述言語 (WSDL: Web Services Description Language) のドキュメントを生成するには、ServiceMetadataBehavior 要素を使用して ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を有効にします。

ms733099.note(ja-jp,VS.100).gif注 :
動作に特定の名前を付ける場合、サービスまたはエンドポイント セクションで指定した behaviorConfiguration と同じ名前にする必要があります。

<behaviors>
    <behavior>
        <ServiceMetadata httpGetEnabled="true" /> 
    </behavior>
</behaviors>
<services>
    <service 
       name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
       <endpoint 
          address="http://computer:8080/Hello"
          contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
          binding="basicHttpBinding" />
       </endpoint>
    </service>
</services>

前の構成では、クライアントが "HelloWorld" の型指定されたサービスを呼び出してメタデータを取得できます。

svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl

異なるバインディング値を使用する 2 つのエンドポイントを持つサービスの指定

この最後の例では、HelloWorld サービス型に 2 つのエンドポイントを構成します。各エンドポイントでは、同じバインディングの種類を使用しますが、カスタマイズした異なる bindingConfiguration 属性を使用します (それぞれで basicHttpBinding を変更)。

<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
    <endpoint
        address="http://computer:8080/Hello1"
        contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        binding="basicHttpBinding"
        bindingConfiguration="shortTimeout"
    </endpoint>
    <endpoint
        address="http://computer:8080/Hello2"
        contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        binding="basicHttpBinding"
        bindingConfiguration="Secure"
     </endpoint>
</service>
<bindings>
    <basicHttpBinding 
        name="shortTimeout"
        timeout="00:00:00:01" 
     />
     <basicHttpBinding 
        name="Secure" />
        <Security mode="Transport" />
</bindings>

次の例に示すように、protocolMapping セクションを追加してバインディングを構成することによって、既定の構成を使用する同じ動作を取得できます。

<protocolMapping>
    <add scheme=”http” binding=”basicHttpBinding” bindingConfiguration=”shortTimeout” />
    <add scheme=”https” binding=”basicHttpBinding” bindingConfiguration=”Secure” />
</protocolMapping>
<bindings>
    <basicHttpBinding 
        name="shortTimeout"
        timeout="00:00:00:01" 
     />
     <basicHttpBinding 
        name="Secure" />
        <Security mode="Transport" />
</bindings>

参照

概念

簡略化された構成
システム標準のバインディング
エンドポイントの作成の概要
サービスとクライアントを構成するためのバインディングの使用