Ejemplo básico
El ejemplo de detección básica muestra cómo hacer que un servicio sea detectable y el procedimiento para buscar y llamar a un servicio detectable. Este ejemplo se compone de dos proyectos: servicio y cliente.
Nota
En él se implementa la detección en el código. Para obtener un ejemplo en el que se implemente la detección en la configuración, consulte Configuración.
Servicio
Se trata de la implementación de un servicio de calculadora sencillo. El código relacionado con la detección se puede encontrar en Main
donde un objeto ServiceDiscoveryBehavior se agrega al host del servicio y un objeto UdpDiscoveryEndpoint se agrega como se muestra en el siguiente código.
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();
// ...
}
Remoto
El cliente usa un objeto DynamicEndpoint para localizar el servicio. El DynamicEndpoint, un extremo estándar, resuelve el extremo del servicio cuando se abre el cliente. En este caso, el DynamicEndpoint busca el servicio según el contrato de servicio. El DynamicEndpoint realiza la búsqueda a través de un UdpDiscoveryEndpoint de forma predeterminada. Cuando localiza un punto de conexión de servicio, el cliente se conecta a ese servicio a través del enlace especificado.
public static void Main()
{
DynamicEndpoint dynamicEndpoint = new DynamicEndpoint( ContractDescription.GetContract(typeof(ICalculatorService)), new WSHttpBinding());
// ...
}
El cliente define un método denominado InvokeCalculatorService
que utiliza la clase DiscoveryClient para buscar servicios. DynamicEndpoint hereda de ServiceEndpoint, de modo que se pueda pasar al método InvokeCalculatorService
. A continuación, el ejemplo utiliza DynamicEndpoint para crear una instancia de CalculatorServiceClient
y llama a diversas operaciones del servicio de calculadora.
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();
}
Para utilizar este ejemplo
Este ejemplo utiliza los extremos HTTP y para ejecutarlo, se deben agregar las ACL de dirección URL apropiadas. Para obtener más información, consulte Configuración de HTTP y HTTPS. Al ejecutar el siguiente comando con privilegios elevados, se deberían agregar las ACL adecuadas. Puede que desee sustituir su dominio y nombre de usuario para los siguientes argumentos si el comando no funciona como debería.
netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%
Con Visual Studio, abra Basic.sln y compile el ejemplo.
Ejecute la aplicación service.exe.
Después de que se inicie el servicio, ejecute la aplicación client.exe.
Observe que el cliente pudo encontrar el servicio sin conocer su dirección.