Windows Communication Foundation (WCF) サービスとの通信はすべて、サービスの エンドポイント を介して行われます。 エンドポイントは、WCF サービスが提供する機能へのアクセスをクライアントに提供します。 このセクションでは、エンドポイントの構造について説明し、構成とコードでエンドポイントを定義する方法について説明します。
エンドポイントの構造
各エンドポイントには、エンドポイントを検索する場所を示すアドレス、クライアントがエンドポイントと通信する方法を指定するバインディング、および使用可能なメソッドを識別するコントラクトが含まれています。
アドレス。 アドレスはエンドポイントを一意に識別し、サービスが配置されている可能性のあるコンシューマーに通知します。 WCF オブジェクト モデルでは、ID、一部の Web サービス記述言語 (WSDL) 要素、および省略可能なヘッダーのコレクションを含む URI (Uniform Resource Identifier) プロパティとアドレス プロパティを含む EndpointAddress アドレスによって表されます。 オプションのヘッダーは、エンドポイントを識別または操作するための追加の詳細なアドレス指定情報を提供します。 詳細については、「 エンドポイント アドレスの指定」を参照してください。
バインド。 バインディングは、エンドポイントと通信する方法を指定します。 バインディングは、エンドポイントが世界と通信する方法を指定します。これには、使用するトランスポート プロトコル (TCP や HTTP など)、メッセージに使用するエンコード (テキストやバイナリなど)、必要なセキュリティ要件 (Secure Sockets Layer [SSL] や SOAP メッセージ セキュリティなど) が含まれます。 詳細については、「 バインディングを使用したサービスとクライアントの構成」を参照してください。
サービス コントラクト。 サービス コントラクトは、エンドポイントがクライアントに公開する機能の概要を示します。 コントラクトは、クライアントが呼び出すことができる操作、メッセージの形式、操作を呼び出すために必要な入力パラメーターまたはデータの種類、およびクライアントが期待できる処理または応答メッセージの種類を指定します。 基本的な 3 種類のコントラクトは、基本的なメッセージ交換パターン (MEP) に対応しています。データグラム (一方向)、要求/応答、双方向 (双方向)。 サービス コントラクトでは、データ コントラクトとメッセージ コントラクトを使用して、アクセス時に特定のデータ型とメッセージ形式を要求することもできます。 サービス コントラクトを定義する方法の詳細については、「サービス コントラクトの設計」を参照してください。 クライアントは、双方向 MEP でサービスからメッセージを受信するために、コールバック コントラクトと呼ばれるサービス定義コントラクトを実装する必要もあります。 詳細については、「 双方向サービス」を参照してください。
サービスのエンドポイントは、コードを使用して命令的に指定することも、構成を通じて宣言によって指定することもできます。 エンドポイントが指定されていない場合、ランタイムは、サービスによって実装される各サービス コントラクトのベース アドレスごとに 1 つの既定のエンドポイントを追加することで、既定のエンドポイントを提供します。 通常、コードでのエンドポイントの定義は実用的ではありません。デプロイされたサービスのバインドとアドレスは、通常、サービスの開発中に使用されるものとは異なるためです。 一般に、コードではなく構成を使用してサービス エンドポイントを定義する方が実用的です。 バインディングとアドレス指定の情報をコードから除外すると、アプリケーションを再コンパイルして再デプロイしなくても変更できます。
注
偽装を実行するサービス エンドポイントを追加する場合、コントラクトを新しいServiceDescription オブジェクトに適切に読み込むには、AddServiceEndpoint メソッドまたは GetContract(Type, Type) メソッドのいずれかを使用する必要があります。
コードでのエンドポイントの定義
次の例は、次のコードでエンドポイントを指定する方法を示しています。
"Hello <name>!" という応答で、だれかの名前とエコーを受け入れる
IEcho
型のサービスのコントラクトを定義します。IEcho
コントラクトによって定義された型のEcho
サービスを実装します。サービスの
http://localhost:8000/Echo
のエンドポイント アドレスを指定します。WSHttpBinding バインディングを使用して
Echo
サービスを構成します。
namespace Echo
{
// Define the contract for the IEcho service
[ServiceContract]
public interface IEcho
{
[OperationContract]
String Hello(string name)
}
// Create an Echo service that implements IEcho contract
class Echo : IEcho
{
public string Hello(string name)
{
return "Hello" + name + "!";
}
public static void Main ()
{
//Specify the base address for Echo service.
Uri echoUri = new Uri("http://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("http://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()
注
サービス ホストはベース アドレスを使用して作成され、その後、ベース アドレスに対する残りのアドレスがエンドポイントの一部として指定されます。 このアドレスのパーティション分割により、ホストのサービスに対して複数のエンドポイントをより便利に定義できます。
注
サービス アプリケーションのServiceDescriptionのプロパティは、ServiceHostBaseの OnOpening メソッドの後で変更しないでください。
ServiceHostBaseおよびServiceHostのCredentials プロパティやAddServiceEndpoint
メソッドなど、一部のメンバーは、その時点を過ぎて変更された場合に例外をスローします。 他の項目は変更可能ですが、結果は未定義です。
同様に、クライアントでは、ServiceEndpointでOnOpeningを呼び出した後に、ChannelFactory値を変更することはできません。 Credentials プロパティは、その時点を過ぎて変更された場合に例外をスローします。 他のクライアント記述値はエラーなしで変更できますが、結果は未定義です。
サービスでもクライアントでも、 Openを呼び出す前に説明を変更することをお勧めします。
構成でのエンドポイントの定義
アプリケーションを作成するときは、多くの場合、アプリケーションをデプロイする管理者に決定を延期する必要があります。 たとえば、多くの場合、サービス アドレス (URI) が何であるかを事前に知る方法はありません。 アドレスをハードコーディングする代わりに、サービスの作成後に管理者がこれを行うことを許可することをお勧めします。 この柔軟性は、構成によって実現されます。 詳細については、「 サービスの構成」を参照してください。
注
serviceModel メタデータ ユーティリティ ツール (Svcutil.exe) を /config:
filename[,
filename]
スイッチと共に使用して、構成ファイルをすばやく作成します。
既定のエンドポイントの使用
コードまたは構成でエンドポイントが指定されていない場合、ランタイムは、サービスによって実装される各サービス コントラクトのベース アドレスごとに 1 つの既定のエンドポイントを追加することで、既定のエンドポイントを提供します。 ベース アドレスはコードまたは構成で指定でき、 Open() が ServiceHostで呼び出されたときに既定のエンドポイントが追加されます。 この例は前のセクションと同じ例ですが、エンドポイントが指定されていないため、既定のエンドポイントが追加されます。
namespace Echo
{
// Define the contract for the IEcho service
[ServiceContract]
public interface IEcho
{
[OperationContract]
String Hello(string name)
}
// Create an Echo service that implements IEcho contract
public class Echo : IEcho
{
public string Hello(string name)
{
return "Hello" + name + "!";
}
public static void Main ()
{
//Specify the base address for Echo service.
Uri echoUri = new Uri("http://localhost:8000/");
//Create a ServiceHost for the Echo service.
ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);
// Open the service host to run it. Default endpoints
// are added when the service is opened.
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("http://localhost:8000/")
' Open the service host to run it. Default endpoints
' are added when the service is opened.
serviceHost.Open()
エンドポイントが明示的に指定されている場合でも、Openを呼び出す前にServiceHostでAddDefaultEndpointsを呼び出すことによって、既定のエンドポイントを追加できます。 既定のエンドポイントの詳細については、「WCF サービスの 簡略化された構成 と 簡略化された構成」を参照してください。