Condividi tramite


Esempio di base

Nell’esempio individuazione di base viene illustrato come rendere individuabile un servizio e come cercare e chiamare un servizio individuabile. Questo esempio è costituito da due progetti, ovvero il servizio e il client.

Nota

In questo esempio l'individuazione viene implementata nel codice. Per un esempio di implementazione dell'individuazione nella configurazione, vedere Configurazione.

Servizio

Si tratta di una semplice implementazione del servizio di calcolatrice. Il codice correlato all'individuazione è disponibile in Main dove un oggetto ServiceDiscoveryBehavior viene aggiunto all'host del servizio e un oggetto UdpDiscoveryEndpoint viene aggiunto come illustrato nel codice seguente.

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

Il client usa un oggetto DynamicEndpoint per individuare il servizio. DynamicEndpoint è un endpoint standard che risolve l'endpoint del servizio all'apertura del client. In questo caso, DynamicEndpoint cerca il servizio basato sul contratto di servizio. Per impostazione predefinita, DynamicEndpoint esegue la ricerca su UdpDiscoveryEndpoint. Dopo aver individuato un endpoint del servizio, il client si connette al servizio sull'associazione specificata.

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

Il client definisce un metodo denominato InvokeCalculatorService che usa la classe DiscoveryClient per la ricerca di servizi. DynamicEndpoint eredita da ServiceEndpoint, pertanto può essere passato al metodo InvokeCalculatorService. Nell'esempio viene quindi usato DynamicEndpoint per creare un'istanza di CalculatorServiceClient e chiamare le varie operazioni del servizio di calcolatrice.

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();
}

Per usare questo esempio

  1. Questo esempio usa endpoint HTTP e per eseguirlo è necessario aggiungere elenchi di controllo di accesso (ACL) agli URL appropriati. Per altre informazioni, vedere Configurazione di HTTP e HTTPS. L'esecuzione del comando seguente con privilegi elevati consente di aggiungere gli elenchi di controllo di accesso appropriati. È possibile che si desideri sostituire il dominio e il nome utente per gli argomenti seguenti quando il comando non funziona nella forma originale. netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%

  2. Da Visual Studio, aprire il Basic.sln e compilare l'esempio.

  3. Eseguire l'applicazione service.exe.

  4. Dopo aver avviato il servizio, eseguire client.exe.

  5. Si osservi che il client è stato in grado di trovare il servizio senza conoscerne l'indirizzo.