エンドポイントの作成の概要
Windows Communication Foundation (WCF) サービスでは、そのサービスの "エンドポイント" を介してすべての通信が行われます**。エンドポイントは、クライアントが WCF サービスによって提供される機能にアクセスできるようにします。ここでは、エンドポイントの構造を説明し、構成やコード内にエンドポイントを定義する方法を概説します。
エンドポイントの構造
各エンドポイントは、そのエンドポイントが存在する場所を示すアドレス、クライアントがエンドポイントと通信するための方法を指定するバインディング、および利用可能なメソッドを特定するコントラクトで構成されます。
- アドレス。アドレスは、エンドポイントを一意に識別し、潜在的ユーザーにそのサービスの場所を示します。WCF オブジェクト モデルでは、EndpointAddress アドレスで表されます。このアドレスは、URI (Uniform Resource Identifier) とアドレス プロパティ (ID、Web サービス記述言語 (WSDL) 要素、およびオプション ヘッダーのコレクションを含む) を格納します。オプションのヘッダーには、エンドポイントの識別または対話に使用される、より詳細なアドレス指定情報が用意されています。詳細な情報については、次のページを参照してください。 「エンドポイント アドレスの指定」を参照してください。
- バインディング。バインディングはエンドポイントとの通信方法を指定します。バインディングでは、使用するトランスポート プロトコル (TCP や HTTP)、メッセージのエンコーディング方法 (テキストやバイナリ)、必要なセキュリティ要件 (SSL (Secure Sockets Layer) や SOAP メッセージ セキュリティ) など、そのエンドポイントがどのように通信を行うかを指定します。詳細な情報については、次のページを参照してください。 「サービスとクライアントを構成するためのバインディングの使用」を参照してください。
- サービス コントラクト。サービス コントラクトは、エンドポイントがクライアントに公開する機能を示します。コントラクトは、クライアントが呼び出すことのできる操作、メッセージの形式、操作の呼び出しに必要な入力パラメータやデータの型、クライアントに提供する処理または応答メッセージの種類を指定します。基本的なメッセージ交換パターン (MEP) に対応する基本的なコントラクトの種類には、データグラム (一方向)、要求/応答、二重 (双方向) の 3 つがあります。サービス コントラクトは、データ コントラクトとメッセージ コントラクトを使用して、クライアントが特定のデータ型とメッセージ形式でアクセスするように要求することもできます。サービス コントラクトの定義方法詳細については、 、「サービス コントラクトの設計」を参照してください。クライアントでは、二重 MEP でサービスからメッセージを受信するために、コールバック コントラクトというサービス定義のコントラクトを実装することが必要な場合があります。詳細な情報については、次のページを参照してください。 「双方向サービス」を参照してください。
サービスのエンドポイントはコードを使用して強制的に指定するか、構成を介して宣言として指定できます。一般に、エンドポイントをコード内で定義する方法は実用的ではありません。展開したサービスのバインディングとアドレスは、そのサービスの開発時に使用するものと異なる場合が多いためです。一般に、サービス エンドポイントの定義にはコードではなく、構成を使用する方がより実用的です。バインディング情報とアドレス情報をコードに含めないことで、変更時にアプリケーションの再コンパイルや再展開を行う必要がなくなります。
メモ : |
---|
偽装を行うサービス エンドポイントを追加する場合は、AddServiceEndpoint メソッドまたは GetContract メソッドのいずれかを使用して、コントラクトを新しい ServiceDescription オブジェクトに適切に読み込む必要があります。 |
コードでのエンドポイントの定義
次の例は、コードにエンドポイントを指定する方法を示しています。
- 誰かの名前を受け取り、"Hello <名前>!" というエコーで応答する IEcho タイプのサービス コントラクトを定義します。
- IEcho コントラクトで定義された型の Echo サービスを実装します。
- サービスのエンドポイント アドレスとして https://localhost:8000/Echo を指定します。
- WSHttpBinding バインディングを使用して Echo サービスを構成します。
Namespace Echo
{
// Define the contract for the IEcho service
[ServiceContract]
Interface IEchoWorld
{
[OperationContract]
String Hello(string name)
}
// Create an Echo service that implements IEcho contract
Class Echo:IEcho
{
Public string Hello(string name)
{
Return "Hello" + name + "!";
}
static void Main ()
{
//Specify the base address for Echo service.
Uri echoUri = new Uri("https://localhost:8000/");
//Create a ServiceHost for the Echo service.
ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);
// Use a predefined WSHttpBinding to configure the service.
WSHttpBinding binding = new WSHttpBinding();
// Add the endpoint for this service to the service host.
serviceHost.AddServiceEndpoint(
typeof(IEcho),
binding,
echoUri
);
// Open the service host to run it.
serviceHost.Open();
}
}
}
' Define the contract for the IEcho service
<ServiceContract()> _
Public Interface IEcho
<OperationContract()> _
Function Hello(ByVal name As String) As String
End Interface
' Create an Echo service that implements IEcho contract
Public Class Echo
Implements IEcho
Public Function Hello(ByVal name As String) As String _
Implements ICalculator.Hello
Dim result As String = "Hello" + name + "!"
Return result
End Function
' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("https://localhost:8000/")
' Create a ServiceHost for the Echo service.
Dim svcHost As ServiceHost = New ServiceHost(GetType(HelloWorld), echoUri)
' Use a predefined WSHttpBinding to configure the service.
Dim binding As New WSHttpBinding()
' Add the endpoint for this service to the service host.
serviceHost.AddServiceEndpoint(GetType(IEcho), binding, echoUri)
' Open the service host to run it.
serviceHost.Open()
メモ : |
---|
サービス ホストはベース アドレスを使用して作成されます。また、残りのアドレス (ベース アドレスの相対アドレス) はエンドポイントの一部として指定されます。このようにアドレスを分割することで、ホストのサービスで複数のエンドポイントを簡単に定義できるようになります。 |
メモ : |
---|
ServiceHostBase の OnOpening メソッドの後で、サービス アプリケーションの ServiceDescription の各プロパティを変更しないでください。このメソッドの後で変更すると、ServiceHostBase および ServiceHost の Credentials プロパティや AddServiceEndpoint メソッドなどの一部のメンバは例外をスローします。変更を許可するメンバもありますが、結果は未定義の状態になります。 同様に、クライアントで、ChannelFactory の OnOpening 呼び出しの後で、ServiceEndpoint 値を変更しないでください。この呼び出しの後で変更すると、Credentials プロパティは例外をスローします。その他のクライアント記述値は、エラーを発生させずに変更できますが、結果は未定義の状態になります。 サービスとクライアントのどちらの場合も、Open の呼び出しの前に記述を変更することをお勧めします。 |
構成でのエンドポイントの定義
アプリケーションの作成では、各種決定事項をアプリケーションを展開する管理者に任せる場合がよくあります。たとえば、どのサービス アドレス (URI) を使用するかなどの情報は、前もって知るすべがありません。アドレスをハードコーディングする代わりに、サービスの作成後に管理者が指定する方が便利です。構成を活用することで、この柔軟性が得られます。詳細については、「サービスの構成」を参照してください。
メモ : |
---|
構成ファイルをすばやく作成するには、/config:filename[,filename] スイッチを指定して ServiceModel Metadata Utility Tool (Svcutil.exe) を使用します。 |