WCF


Es un marco para generar aplicaciones orientadas a servicios. WCF puede enviar datos como mensajes asincrónicos de un extremo a otro extremo. Un extremo de servicio puede formar parte de un servicio disponible continuamente hospedado por IIS, o puede ser un servicio hospedado en una aplicación. Un extremo puede ser un cliente de un servicio que solicita datos de un extremo de servicio. Los mensajes pueden ser tan simples como un carácter o una palabra que se envía como XML, o tan complejos como una secuencia de datos binarios. No son stateless.

1. Definición de Contrato

Visual Studio creará el proyecto que contiene 3 archivos:

IService1: Contiene un contrato de servicio predeterminado.

Service1: Contiene una implementación predeterminada de un contrato de servicio.

App.config: Contiene la configuración necesaria para cargar el servicio predeterminado con el host de servicio WCF de visual studio.

En IService1 se debe definir una interfaz con el atributo ServiceContract y OperationContract para cada operación. Para el ejemplo este contrato define una calculadora en línea:

[ServiceContract]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);

    [OperationContract]
    double Substract(double n1, double n2);

    [OperationContract]
    double Multiply(double n1, double n2);

    [OperationContract]
    double Divide(double n1, double n2);
}

2. Implementación de un contrato

En Service1 clase se debe implementar la interfaz del paso anterior.

public class CalculatorService : ICalculator
{
    public double Add(double n1,double n2)
    {
        double result = n1 + n2;
        Console.WriteLine($"La suma de {n1} con {n2} es {result}");
        return result;
    }

    public double Substract(double n1, double n2)
    {
        double result = n1 - n2;
        Console.WriteLine($"La resta de {n1} con {n2} es {result}");
        return result;
    }

    public double Multiply(double n1, double n2)
    {
        double result = n1 * n2;
        Console.WriteLine($"La multiplicacion de {n1} con {n2} es {result}");
        return result;
    }

    public double Divide(double n1, double n2)
    {
        double result = n1 / n2;
        Console.WriteLine($"La division de {n1} con {n2} es {result}");
        return result;
    }

3. Hospedar y ejecutar un servicio

Se debe agregar un proyecto de consola a la solución dando click derecho en la solución y agregar proyecto.

El proyecto de consola se debe asignar como proyecto de inicio.

Verificar que el proyecto de consola dandole click derecho, propiedades del proyecto que el framework destino se 4.5 o superior.

Agregar la referencia del proyecto WCF al proyecto de Consola

Agregar la referencia System.ServiceModel al proyecto de Consola dando clic derecho sobre el proyecto, agregar referencia.

Para hospedar el servicio en la clase Program debemos:

  1. Crear una uri: Se debe crear una url mediante la cual el servicio va a ser accedido.
  2. Crear una instancia de ServiceHost: Esta instancia hospeda el servicio y recibe dos parámetros, el tipo de clase que implementa el contrato y la dirección base del servicio.
  3. Adicionar un endpoint al servicio: Un punto de conexión consta de un un contrato (ICalculator), un enlace (WSHttpBinding es un enlace integrado que se utiliza para conectarse a extremos compatibles con WS-*) y una dirección (CalculatorService que se adiciona a la dirección base).
  4. Habilitar el intercambio de metadatos: Los clientes usarán intercambio de metadatos para generar los servidores proxy que se utilizaran para llamar las operaciones.
  5. Iniciar el servicio: Escucha los mensajes entrantes .
static void Main(string[] args)
        {

            //1. Crear una uri
            Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service");

            //2. Crear una instancia de ServiceHost
            ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);

            try
            {
                //3. Adicionar un endpoint al servicio
                selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");

                //4. Habilitar el intercambio de metadatos
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                selfHost.Description.Behaviors.Add(smb);

                //5. Iniciar el servicio
                selfHost.Open();
                Console.WriteLine("El servicio esta corriendo");
                Console.WriteLine("Presione <ENTER> para finalizar el servicio");
                Console.WriteLine();
                Console.ReadLine();

                //6. Cerrar el servicio
                selfHost.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Un excepcion ha ocurrido: {ex.Message}");
                selfHost.Abort();
            }

        }

Si se cambian los nombres de los archivos services1 y Iservice1 validar en el app config que correspondan los servicios con las interfaces

<services>
      <service name="GettingStartedLib.CalculatorService">
        <endpoint address="" binding="basicHttpBinding" contract="GettingStartedLib.ICalculator">

Para comprobar que el servicio esta funcionando, se debe ejecutar la aplicación de consola, asegurandose que vs fue abierto como administrador y luego en el navegador ingresar a http://localhost:8000/ServiceModelSamples/Service

NOTA: Servicios como este requieren permiso para registrar las direcciones HTTP en el equipo para la realización de escuchas. Las cuentas Administrador tienen este permiso, pero las cuentas de usuario no administrador deben tener concedido permiso para los espacios de nombres HTTP. Para obtener más información sobre cómo configurar las reservas de espacio de nombres, vea Configuración de HTTP y HTTPS.

4. Creación de un cliente

Se deben asociar los metadatos de un un servicio WCF creando un proxy que pueda tener acceso al servicio, para esto se debe agregar referencia de servicio el cual genera un archivo de código fuente administrado para un proxy.

NOTA: También puede usar el la herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) herramienta para generar la clase de proxy y la configuración en lugar de usar Agregar referencia de servicio dentro de Visual Studio.

Se debe agregar un proyecto de consola (puede ser un proyecto web u otro cliente) a la solución dando click derecho en la solución y agregar proyecto.

Verificar que el proyecto de consola dandole click derecho, propiedades del proyecto que el framework destino se 4.5 o superior.

Agregar la referencia System.ServiceModel al proyecto de Consola dando clic derecho sobre el proyecto, agregar referencia.

Ejecutar como administrador una nueva instancia de visual studio y ejecutar el proyecto. En la otra instancia de visual studio se debe agregar la referencia del servicio del Host dando clic derecho sobre el proyecto, agregar referencia de servicio y escribiendo la url del servicio del host.

Luego detener el proyecto en ejecución, y cerrar visual studio.

5. Configuración de un cliente

En este paso se explica como mediante la funcionalidad agregar referencia de servicio web de visual studio se genera un a configuración adicional en el App.config que consiste en especificar el punto de conexión que utiliza el cliente para obtener acceso al servicio. Un extremo tiene una dirección, un enlace y un contrato y cada uno de estos elementos se debe especificar en el proceso de configuración del cliente.

Este es un ejemplo de como debe quedar configurado el archivo.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
    <startup>   
      <!-- Especifica la version del WCF a usar-->  
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5,Profile=Client" />  
    </startup>  
    <system.serviceModel>  
        <bindings>  
            <!-- Uso de wsHttpBinding-->  
            <wsHttpBinding>  
                <binding name="WSHttpBinding_ICalculator" />  
            </wsHttpBinding>  
        </bindings>  
        <client>  
            <!-- Especifica el endpoint a usar cuando llaman el servicio -->  
            <endpoint address="http://localhost:8000/ServiceModelSamples/Service/CalculatorService"  
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator"  
                contract="ServiceReference1.ICalculator" name="WSHttpBinding_ICalculator">  
                <identity>  
                    <userPrincipalName value="[email protected]" />  
                </identity>  
            </endpoint>  
        </client>  
    </system.serviceModel>  
</configuration>

6. Utilización del cliente

En el archivo Program.cs del cliente vamos implementar los métodos del servicio del WCF.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GettingStartedClient.ServiceReference1;

namespace GettingStartedClient
{
    class Program
    {
        static void Main(string[] args)
        {
            //Crear una instancia del proxy de WCF
            CalculatorClient client = new CalculatorClient();

            //Llamar las operaciones del servicio
            double value1 = 8D;
            double value2 = 2D;
            double result;

            result = client.Add(value1,value2);
            Console.WriteLine($"{value1} + {value2} = {result}");

            result = client.Substract(value1, value2);
            Console.WriteLine($"{value1} - {value2} = {result}");

            result = client.Multiply(value1, value2);
            Console.WriteLine($"{value1} * {value2} = {result}");

            result = client.Divide(value1, value2);
            Console.WriteLine($"{value1} / {value2} = {result}");

            client.Close();
        }
    }
}

Para más información https://docs.microsoft.com/es-es/dotnet/framework/wcf/

results matching ""

    No results matching ""