インターフェイス (またはクラス) に対して ServiceContractAttribute 属性を使用して、サービス コントラクトを定義します。その後、1 つ以上のクラス (またはインターフェイス) のメソッドに対して OperationContractAttribute 属性を使用して、コントラクトのサービス操作を定義します。サービス コントラクトを実装して、Windows Communication Foundation バインディングと EndpointAddress オブジェクトと組み合わせたときに、サービス コントラクトが公開され、クライアントにより使用されます。簡単な例を使用した処理の概要については、「チュートリアル入門」を参照してください。サービス コントラクトの作成の詳細については、「サービスの設計と実装」を参照してください。
ServiceContractAttribute とそのインターフェイスで表現される情報は、Web サービス記述言語 (WSDL) の <portType> 要素に大まかに関連しています。サービス コントラクトはサーバー側で、サービスのエンドポイントが呼び出し元に対して何を公開するかを指定するために使用されます。サービス コントラクトはクライアント側でも使用され、クライアントが通信を行うエンドポイントのコントラクトを指定します。双方向コントラクトの場合は、クライアントが双方向のメッセージ交換を行うために実装する必要があるコールバック コントラクトを (CallbackContract プロパティを使用して) 指定します。
メモ : |
|---|
さらに、ServiceContractAttribute で修飾したインターフェイスまたはクラスがなんらかの機能を公開するには、OperationContractAttribute 属性でマークされた、少なくとも 1 つのメソッドを持つ必要があります。この 2 つの属性を使用してサービスの定義と実装を行う最も単純な方法のコード例については、「使用例」のセクションを参照してください。 |
サービス コントラクトを変更するには、ServiceContractAttribute プロパティを使用します。
サービスはサービス コントラクトを実装します。サービス コントラクトは、サービスの種類がサポートするデータ交換を表します。サービス クラスは、OperationContractAttribute でマークされたメソッドを持つ ServiceContractAttribute でマークされたインターフェイスを実装することで、サービス コントラクトを実装できます。または、ServiceContractAttribute でマークし、OperationContractAttribute 属性を独自のメソッドに適用できます。(クラスが、ServiceContractAttribute でマークされたインターフェイスを実装する場合は、クラス自身を ServiceContractAttribute でマークすることはできません)。サービスの種類の OperationContractAttribute でマークされたメソッドは、サービスの種類自体によって指定される既定のサービス コントラクトの一部として処理されます。サービス操作の詳細については、OperationContractAttribute を参照してください。
既定では、Name プロパティと Namespace プロパティは、それぞれコントラクトの種類とhttp://tempuri.org であり、ProtectionLevel は ProtectionLevel..::.None です。サービス コントラクトでは、名前、名前空間、および保護レベルを、これらのプロパティを使用して明示的に設定することをお勧めします。この作業により、次の 2 つの目標が達成されます。第 1 に、マネージ型情報に直接接続されないコントラクトを構築し、コントラクトを WSDL で表現するときに、コントラクトを壊さずにマネージ コードと名前空間をリファクタリングできます。第 2 に、コントラクト自体の保護レベルを明示的に要求することによって、ランタイムがバインディング構成でそのレベルのセキュリティがサポートされているかどうかを検証でき、それによって、機密情報を漏洩する不良な構成を回避できます。保護レベルの詳細については、「保護レベルの理解」を参照してください。
クライアント アプリケーションで使用するためにサービスを公開するには、サービス エンドポイントを Windows Communication Foundation (WCF) に登録するホスト アプリケーションを作成します。Windows アクティベーション サービス (WAS) を使用する WCF サービスは、コンソール アプリケーション、Windows サービス アプリケーション、ASP.NET アプリケーション、Windows フォーム アプリケーション、またはその他の種類のアプリケーション ドメインでホストできます。
WAS でのホスティングは、ASP.NET アプリケーションの作成とほとんど同じです。詳細については、「方法 : IIS で WCF サービスをホストする」を参照してください。
クライアントは、サービス コントラクト インターフェイス (ServiceContractAttribute でマークされたインターフェイス) を使用してサービスへのチャネルを作成するか、またはクライアント オブジェクト (サービス コントラクト インターフェイスの型情報と ClientBase<(Of <(TChannel>)>) クラスの組み合わせ) を使用してサービスと通信します。サービスへのクライアント チャネルの詳細については、ChannelFactory<(Of <(TChannel>)>) クラスと「WCF クライアントの概要」を参照してください。
ServiceContractAttribute クラスまたはインターフェイスを使用して別の ServiceContractAttribute クラスまたはインターフェイスから継承すると、親コントラクトが拡張されます。たとえば、IChildContract インターフェイスが ServiceContractAttribute でマークされ、別のサービス コントラクト インターフェイスである IParentContract から継承された場合、IChildContract サービス コントラクトには、IParentContract と IChildContract の両方のメソッドが含まれます。コントラクト (クラスまたはインターフェイス) の拡張は、マネージ クラスとマネージ インターフェイスの拡張とほとんど同じです。
サービスを作成する最も柔軟な方法は、最初にサービス コントラクト インターフェイスを定義し、その後、サービス クラスでそのインターフェイスを実装することです。(これは、定義済みのサービス コントラクトを実装する必要がある場合に、サービスを構築するための最も簡単な方法でもあります)。クラスを ServiceContractAttribute でマークし、メソッドを OperationContractAttribute でマークすることで直接サービスを構築する方法は、サービスが 1 つのコントラクトを公開する場合に適しています (ただし、そのコントラクトは、複数のエンドポイントによって公開できます)。
CallbackContract プロパティを使用して、別のサービス コントラクトが元のサービス コントラクトにバインドされたときに、送信と受信を独立して実行できるメッセージ交換を定義するように別のサービス コントラクトに指示します。詳細については、CallbackContract のトピックを参照してください。