アプリケーションを作成するときは、多くの場合、アプリケーションのデプロイ後に管理者に決定を延期する必要があります。 たとえば、多くの場合、サービス アドレスや Uniform Resource Identifier (URI) が何であるかを事前に知る方法はありません。 アドレスをハードコーディングする代わりに、サービスの作成後に管理者がこれを行うことを許可することをお勧めします。 この柔軟性は、構成によって実現されます。
注
/config
スイッチで ServiceModel メタデータ ユーティリティ ツール (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 つ以上のエンドポイントとサービスの設定を使用してサービスの種類を構成できます。 各エンドポイントは、アドレス、コントラクト、バインディングを使用して構成できます。 エンドポイントの詳細については、「 エンドポイント作成の概要」を参照してください。 エンドポイントが指定されていない場合、ランタイムは既定のエンドポイントを追加します。 既定のエンドポイント、バインディング、および動作の詳細については、「WCF サービスの 簡略化された構成 と 簡略化された構成」を参照してください。
バインディングは、トランスポート (HTTP、TCP、パイプ、メッセージ キュー) とプロトコル (セキュリティ、信頼性、トランザクション フロー) を指定し、バインド要素で構成され、それぞれがエンドポイントが世界と通信する方法の側面を指定します。
たとえば、<basicHttpBinding> 要素を指定すると、エンドポイントのトランスポートとして HTTP を使用することを示します。 これは、このエンドポイントを使用するサービスが開かれたときに、実行時にエンドポイントを接続するために使用されます。
バインドには、定義済みとカスタムの 2 種類があります。 定義済みのバインドには、一般的なシナリオで使用される要素の便利な組み合わせが含まれています。 WCF で提供される定義済みのバインドの種類の一覧については、「 System-Provided バインド」を参照してください。 定義済みのバインド コレクションに、サービス アプリケーションに必要な機能の適切な組み合わせがない場合は、アプリケーションの要件を満たすようにカスタム バインドを構築できます。 カスタム バインドの詳細については、「 <customBinding>」を参照してください。
次の 4 つの例は、WCF サービスの設定に使用される最も一般的なバインディング構成を示しています。
バインドの種類を使用するエンドポイントの指定
最初の例は、アドレス、コントラクト、バインディングで構成されたエンドポイントを指定する方法を示しています。
<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" />
</service>
この例では、 name
属性は、構成の対象となるサービスの種類を示します。
HelloWorld
コントラクトを使用してコード内にサービスを作成すると、構成例で定義されているすべてのエンドポイントで初期化されます。 アセンブリが 1 つのサービス コントラクトのみを実装する場合は、サービスが使用可能な唯一の型を使用するため、 name
属性を省略できます。 属性は文字列を受け取ります。文字列は形式にする必要があります Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
address
属性は、他のエンドポイントがサービスとの通信に使用する URI を指定します。 URI には、絶対パスまたは相対パスを指定できます。 相対アドレスが指定されている場合、ホストはバインディングで使用されるトランスポート スキームに適したベース アドレスを提供することが期待されます。 アドレスが構成されていない場合、ベース アドレスはそのエンドポイントのアドレスであると見なされます。
contract
属性は、このエンドポイントが公開しているコントラクトを指定します。 サービス実装型は、コントラクト型を実装する必要があります。 サービス実装で 1 つのコントラクト型が実装されている場合は、このプロパティを省略できます。
binding
属性は、この特定のエンドポイントに使用する定義済みバインディングまたはカスタム バインドを選択します。 バインディングを明示的に選択しないエンドポイントでは、既定のバインド選択が使用されます。これは BasicHttpBinding
です。
定義済みバインディングの変更
次の例では、定義済みのバインドが変更されています。 その後、サービス内の任意のエンドポイントを構成するために使用できます。 バインドは、 ReceiveTimeout 値を 1 秒に設定することで変更されます。 このプロパティは、 TimeSpan オブジェクトを返します。
その変更されたバインディングは、bindings セクションにあります。 この変更されたバインドは、endpoint
要素でbinding
属性を設定することで、エンドポイントを作成するときに使用できるようになりました。
注
バインディングに特定の名前を付ける場合は、サービス エンドポイントで指定された 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" />
</service>
<bindings>
<basicHttpBinding
receiveTimeout="00:00:01"
/>
</bindings>
サービスに適用する動作の構成
次の例では、サービスの種類に対して特定の動作が構成されています。
ServiceMetadataBehavior
要素は、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を有効にしてサービスのクエリを実行し、メタデータから Web サービス記述言語 (WSDL) ドキュメントを生成するために使用されます。
注
動作に特定の名前を付ける場合は、サービスまたはエンドポイント セクションで指定された 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" />
</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
address="http://computer:8080/Hello2"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="Secure" />
</service>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure">
<Security mode="Transport" />
</basicHttpBinding>
</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>