次の方法で共有


基本的なサンプル

基本的な検出サンプルは、サービスを検出可能にする方法と、探索可能なサービスを検索して呼び出す方法を示しています。 このサンプルは、サービスとクライアントの 2 つのプロジェクトで構成されています。

このサンプルでは、コードで検出を実装します。 構成で検出を実装するサンプルについては、「 構成」を参照してください。

サービス

これは、単純な電卓サービスの実装です。 検出関連のコードは、次のコードに示すように、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();
    // ...
}

顧客

クライアントは、 DynamicEndpoint を使用してサービスを検索します。 標準エンドポイントである DynamicEndpointは、クライアントを開いたときにサービスのエンドポイントを解決します。 この場合、 DynamicEndpoint はサービス コントラクトに基づいてサービスを検索します。 DynamicEndpointでは、既定でUdpDiscoveryEndpointに対して検索が実行されます。 サービス エンドポイントを見つけたら、クライアントは指定されたバインディングを介してそのサービスに接続します。

public static void Main()
{
   DynamicEndpoint dynamicEndpoint = new DynamicEndpoint( ContractDescription.GetContract(typeof(ICalculatorService)), new WSHttpBinding());
   // ...
}

クライアントは、InvokeCalculatorService クラスを使用してサービスを検索するDiscoveryClientというメソッドを定義します。 DynamicEndpointServiceEndpointから継承されるため、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();
}

このサンプルを使用するには

  1. このサンプルでは HTTP エンドポイントを使用し、このサンプルを実行するには、適切な URL ACL を追加する必要があります。 詳細については、 HTTP および HTTPS の構成を参照してください。 管理者特権で次のコマンドを実行すると、適切な ACL が追加されます。 コマンドがそのまま動作しない場合は、次の引数にドメインとユーザー名を置き換える必要があります。 netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%

  2. Visual Studio を使用して、Basic.slnを開き、サンプルをビルドします。

  3. service.exe アプリケーションを実行します。

  4. サービスが開始されたら、client.exeを実行します。

  5. クライアントがそのアドレスを知らずにサービスを見つけることができたことを確認します。