基本的なサンプル
基本的な探索のサンプルでは、サービスを探索可能にする方法と、探索可能なサービスの検索方法および呼び出し方法を示します。 このサンプルは、2 つのプロジェクト (サービスとクライアント) で構成されます。
Note
このサンプルでは、探索をコードで実装しています。 構成で探索を実装するサンプルについては、「構成」を参照してください。
サービス
これは簡単な電卓サービスの実装です。 探索関連のコードは Main
にあります。ここでは、次のコードに示すように、 ServiceDiscoveryBehavior がサービス ホストに追加され、UdpDiscoveryEndpoint が追加されます。
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
serviceHost.AddServiceEndpoint(typeof(ICalculatorService), new
WSHttpBinding(), String.Empty);
// Make the service discoverable over UDP multicast
serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());
serviceHost.Open();
// ...
}
Client
クライアントは、DynamicEndpoint を使用してサービスを検索します。 DynamicEndpoint は標準エンドポイントで、クライアントが開いたときにサービスのエンドポイントを解決します。 この場合、DynamicEndpoint は、サービス コントラクトに基づいてサービスを検索します。 DynamicEndpoint は、既定で UdpDiscoveryEndpoint を検索します。 サービス エンドポイントが見つかると、クライアントは指定されたバインディングを介してそのサービスに接続します。
public static void Main()
{
DynamicEndpoint dynamicEndpoint = new DynamicEndpoint( ContractDescription.GetContract(typeof(ICalculatorService)), new WSHttpBinding());
// ...
}
クライアントは、InvokeCalculatorService
クラスを使用してサービスを検索する DiscoveryClient という名前のメソッドを定義します。 DynamicEndpoint は ServiceEndpoint を継承しているため、InvokeCalculatorService
メソッドに渡すことができます。 この例では、次に DynamicEndpoint を使用して CalculatorServiceClient
インスタンスを作成し、電卓サービスのさまざまな操作を呼び出します。
static void InvokeCalculatorService(ServiceEndpoint serviceEndpoint)
{
// Create a client
CalculatorServiceClient client = new CalculatorServiceClient(serviceEndpoint);
Console.WriteLine("Invoking CalculatorService");
Console.WriteLine();
double value1 = 100.00D;
double value2 = 15.99D;
// Call the Add service operation.
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
// Call the Subtract service operation.
result = client.Subtract(value1, value2);
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
// Call the Multiply service operation.
result = client.Multiply(value1, value2);
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
// Call the Divide service operation.
result = client.Divide(value1, value2);
Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
Console.WriteLine();
//Closing the client gracefully closes the connection and cleans up resources
client.Close();
}
このサンプルを使用するには
このサンプルでは HTTP エンドポイントを使用します。このサンプルを実行するには、適切な URL ACL を追加する必要があります。 詳細については、「HTTP および HTTPS の構成」を参照してください。 管理特権で次のコマンドを実行すると、適切な ACL が追加されます。 そのままではコマンドが動作しない場合は、代わりに、ドメインとユーザー名を引数に指定して実行してみてください。
netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%
Visual Studio を使用して、Basic.sln を開き、サンプルをビルドします。
service.exe アプリケーションを実行します。
サービスが開始したら、client.exe を実行します。
クライアントがサービスのアドレスを知ることなくサービスを検索できたことを確認します。