Windows Communication Foundation サービスのバインディングの構成
アプリケーションの作成では、アプリケーションの配置後は各種決定事項を管理者に任せる場合がよくあります。たとえば、どのサービス アドレス (URI (Uniform Resource Identifier)) を使用するかなどの情報は、多くの場合、前もって知る方法がありません。アドレスをハードコーディングする代わりに、サービスの作成後に管理者が指定する方が便利です。構成を活用することで、この柔軟性が得られます。
メモ : |
---|
構成ファイルをすばやく作成するには、/config スイッチを指定して ServiceModel Metadata Utility Tool (Svcutil.exe) を使用します。 |
主要なセクション
Windows Communication Foundation (WCF) 構成スキームは、3 つの主要なセクション (serviceModel、bindings、および services) で構成されます。
<configuration>
<system.serviceModel>
<bindings>
</bindings>
<services>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
ServiceModel 要素
system.ServiceModel 要素によって囲まれたこのセクションを使用して、1 つ以上のエンドポイントを持つサービス型、およびサービスの設定を構成できます。各エンドポイントでは、アドレス、コントラクト、およびバインディングをそれぞれ 1 つずつ構成できます。エンドポイント詳細については、 、「エンドポイントの作成の概要」を参照してください。
バインディングはトランスポート (HTTP、TCP、パイプ、およびメッセージ キュー) とプロトコル (セキュリティ、信頼性、およびトランザクション フロー) を指定し、バインディング要素で構成されます。各バインディング要素は、エンドポイントの通信方法のさまざまな側面を指定します。
たとえば、basicHttpBinding 要素を指定すると、エンドポイントのトランスポートとして HTTP が使用されます。このエンドポイントを使用するサービスが開かれる実行時に、エンドポイントとの接続に HTTP が使用されます。
バインディングには、定義済みバインディングとカスタム バインディングの 2 種類があります。定義済みバインディングには、一般的なシナリオで使用される要素の組み合わせが含まれています。WCF で提供される定義済みバインディングの種類の一覧については、「システム標準のバインディング」を参照してください。定義済みバインディング コレクションに、サービス アプリケーションに必要な正しい機能の組み合わせがないときは、カスタム バインディングを作成して、そのアプリケーションの要件を満たすことができます。カスタム バインディング詳細については、 、「<customBinding>」を参照してください。
次の 4 つの例は、WCF サービスの設定に使用される最も一般的なバインディング構成を示しています。
バインディングの種類を使用するエンドポイントを指定する
最初の例は、アドレス、コントラクト、およびバインディングをそれぞれ 1 つずつ使用して構成されたエンドポイントを指定する方法を示しています。
<service type="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>
この例では、type 属性は、構成がどのサービス型に対するものであるかを示します。HelloWorld
コントラクトを使用してコードでサービスを作成すると、そのサービスは、この例の構成に定義されているすべてのエンドポイントと共に初期化されます。アセンブリにサービス コントラクトが 1 つしか実装されない場合、サービスは使用可能なタイプだけを使用するため、type 属性を省略できます。この属性が受け取る文字列は、Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
の形式で指定される必要があります。
address 属性では、他のエンドポイントがこのサービスと通信するために使用する URI を指定します。この URI は、絶対パスでも相対パスでもかまいません。相対アドレスを指定すると、ホストは、そのバインディングで使用されるトランスポート スキームに適したベース アドレスを提供します。アドレスが構成されていない場合、ベース アドレスはそのエンドポイントのアドレスと見なされます。
contract 属性では、このエンドポイントが公開するコントラクトを指定します。サービス実装の型は、コントラクト型を実装する必要があります。サービス実装が単一のコントラクトの型を実装する場合は、このプロパティを省略できます。
binding 属性では、この特定のエンドポイントに使用される定義済みバインディングまたはカスタム バインディングを選択します。バインディングが明示的に選択されていないエンドポイントでは、既定のバインディング選択 (BasicHttpBinding) を使用します。
定義済みバインディングの変更
次の例では、定義済みバインディングを変更して名前を付けます。これにより、サービスの任意のエンドポイントを構成するために使用できるようになります。バインディングの変更では、ReceiveTimeout 値を 1 秒に設定します。このプロパティは、TimeSpan オブジェクトを返します。
変更したバインディングは bindings セクション内にあります。この変更したバインディングに shortTimeout
という一意の名前を付けます。これは name 属性で設定します。この変更したバインディングは、endpoint 要素の binding 属性をこの一意の名前に設定することにより、任意のエンドポイントを作成するときに使用できます。これにより、標準バインディングのバリエーションをほぼ無制限に作成できます。
メモ : |
---|
標準バインディングのバリエーションを作成しないときは、bindingConfiguration 属性の値を設定する必要はありません。その場合は、変更されていない定義済みバインディングが使用されます。 |
<service type="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
name="shortTimeout"
receiveTimeout="00:00:01"
/>
</bindings>
サービスに適用する動作を構成する
次の例では、サービス型に対して、特定の動作を構成します。サービスに照会し、メタデータから Web サービス記述言語ツール (WSDL: Web Services Description Language) ドキュメントを生成するには、metadataPublishing 要素を使用して ServiceModel Metadata Utility Tool (Svcutil.exe) を有効にします。
<behaviors>
<behavior name="MetaPlusExceptions" >
<metadataPublishing enableGetWsdl="true" />
</behavior>
</behaviors>
<services>
<service
type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
serviceBehaviorName="MetaPlusExceptions">
<endpoint
address="http://computer:8080/Hello"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</endpoint>
</service>
</services>
前の構成により、クライアントは次のコマンドを呼び出すことができます。
svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl
その結果、"HelloWorld" の型指定されたサービスのメタデータが取得されます。
異なるバインディング値を使用する 2 つのエンドポイントを持つサービスを指定する
この最後の例では、Hello
サービス型に 2 つのエンドポイントを構成します。各エンドポイントでは、同じバインディングの種類を使用しますが、カスタマイズした異なる bindingConfiguration 属性を使用します (それぞれで basicHttpBinding を変更)。
<service type="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"
bindingConfiguration="shortTimeout"
</endpoint>
<endpoint
address="http://computer:8080/Hello"
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>