更新 : 2007 年 11 月
インターフェイスまたはクラスが、Windows Communication Foundation (WCF) アプリケーション内にサービス コントラクトを定義することを示します。
名前空間 :
System.ServiceModel
アセンブリ :
System.ServiceModel (System.ServiceModel.dll 内)
<AttributeUsageAttribute(AttributeTargets.Class Or AttributeTargets.Interface, Inherited := False, _
AllowMultiple := False)> _
Public NotInheritable Class ServiceContractAttribute _
Inherits Attribute
Dim instance As ServiceContractAttribute
[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Interface, Inherited = false,
AllowMultiple = false)]
public sealed class ServiceContractAttribute : Attribute
[AttributeUsageAttribute(AttributeTargets::Class|AttributeTargets::Interface, Inherited = false,
AllowMultiple = false)]
public ref class ServiceContractAttribute sealed : public Attribute
/** @attribute AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Interface, Inherited = false, AllowMultiple = false) */
public final class ServiceContractAttribute extends Attribute
public final class ServiceContractAttribute extends Attribute
インターフェイス (またはクラス) に対して 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 のトピックを参照してください。
次のコード例は、ServiceContractAttribute をインターフェイスに適用し、OperationContractAttribute によって示される 1 つのサービス メソッドを持つサービス コントラクトを定義する方法を示しています。この場合、すべてのメッセージのバインディングで要求される保護レベルは ProtectionLevel..::.EncryptAndSign です。
その後、このコード例では、定義したコントラクトを SampleService クラスで実装します。
using System;
using System.Collections.Generic;
using System.Net.Security;
using System.ServiceModel;
using System.Text;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Namespace="http://microsoft.wcf.documentation",
Name="SampleService",
ProtectionLevel=ProtectionLevel.EncryptAndSign
)]
public interface ISampleService{
[OperationContract]
string SampleMethod(string msg);
}
class SampleService : ISampleService
{
#region ISampleService Members
public string SampleMethod(string msg)
{
return "The service greets you: " + msg;
}
#endregion
}
}
次のコード例は、上のサービス用の 1 つのエンドポイントを作成する単純な構成ファイルを示しています。
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="mex"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/SampleService"/>
</baseAddresses>
</host>
<endpoint
address=""
binding="wsHttpBinding"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
次のコード例は、上の SampleService を呼び出す単純なクライアントを示しています。
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
public class Client
{
public static void Main()
{
// Picks up configuration from the config file.
SampleServiceClient wcfClient = new SampleServiceClient();
try
{
// Making calls.
Console.WriteLine("Enter the greeting to send: ");
string greeting = Console.ReadLine();
Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));
Console.WriteLine("Press ENTER to exit:");
Console.ReadLine();
// Done with service.
wcfClient.Close();
Console.WriteLine("Done!");
}
catch (TimeoutException timeProblem)
{
Console.WriteLine("The service operation timed out. " + timeProblem.Message);
wcfClient.Abort();
Console.Read();
}
catch(CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message);
wcfClient.Abort();
Console.Read();
}
}
}
System..::.Object
System..::.Attribute
System.ServiceModel..::.ServiceContractAttribute
この型のすべてのパブリック static (Visual Basic では Shared) メンバは、スレッド セーフです。インスタンス メンバの場合は、スレッド セーフであるとは限りません。
Windows Vista, Windows XP SP2, Windows Server 2003
.NET Framework および .NET Compact Framework では、各プラットフォームのすべてのバージョンはサポートしていません。サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。
.NET Framework
サポート対象 : 3.5、3.0
参照
その他の技術情報