Acceso a los servicios mediante un cliente WCF

El siguiente paso tras completar el proceso de creación de un servicio consiste en crear un cliente proxy WCF. Las aplicaciones de cliente se comunican con los servicios mediante un proxy de cliente WCF. Estas aplicaciones de cliente suelen importar los metadatos de un servicio para generar un código de cliente WCF que pueda usarse para invocar el servicio.

Los pasos básicos que debe completar para crear un cliente WCF son los siguientes:

  1. Compilar el código del servicio.

  2. Genere el proxy de cliente WCF.

  3. Cree una instancia del proxy de cliente de WCF.

El proxy de cliente WCF se puede generar manualmente mediante el uso de la herramienta de utilidad de metadatos del modelo de servicio (SvcUtil.exe). Para obtener más información, consulte Herramienta de utilidad de metadatos de ServiceModel (SvcUtil.exe). El proxy de cliente WCF también se puede generar en Visual Studio mediante el uso de la característica Agregar referencia de servicio. Para generar el proxy de cliente de WCF usando cualquier método, el servicio debe estar en ejecución. Si el servicio se autohospeda, debe ejecutar el host. Si el servicio se hospeda en IIS/WAS no necesita hacer nada más.

Herramienta de utilidad de metadatos ServiceModel

La herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) es una herramienta de línea de comandos que puede usarse para generar código a partir de metadatos. A continuación se muestra un ejemplo del uso de un comando básico Svcutil.exe.

Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>

Como alternativa, puede usar Svcutil.exe con archivos de Lenguaje de descripción de servicios Web (WSDL) y de lenguaje de definición de esquemas XML (XSD) en el sistema de archivos.

Svcutil.exe <list of WSDL and XSD files on file system>

El resultado será un archivo de código que contendrá código de cliente WCF que podrá usarse en la aplicación de cliente para invocar el servicio.

También puede usar la herramienta para generar archivos de configuración.

Svcutil.exe <file1 [,file2]>

Si se proporciona solo uno nombre de archivo, ése será el nombre del archivo de salida. Si se proporcionan dos nombres de archivo, entonces el primer archivo es un archivo de configuración de entrada cuyo contenido está combinado con la configuración generada y que se escribe en el segundo archivo. Para obtener más información sobre el proceso de configuración, consulte Configuración de enlaces para servicios.

Importante

Las solicitudes de metadatos que no son seguras plantean ciertos riesgos, al igual que cualquier solicitud de una red no segura: si no está seguro de que el punto de conexión con el que se está comunicando es el que dice ser, es posible que la información que recupere sean metadatos de un servicio malintencionado.

Agregar referencia de servicio en Visual Studio

Mientras que el servicio esté ejecutándose, haga clic con el botón derecho en el proyecto que contendrá el proxy de cliente WCF y seleccione el elemento Agregar>Referencia de servicio. En el diálogo Agregar referencia de servicio, escriba la URL del servicio al que desea llamar y haga clic en el botón Ir. El cuadro de diálogo mostrará una lista de servicios disponibles en la dirección especificada. Haga doble clic en el servicio para visualizar los contratos y las operaciones que están disponibles, especifique un espacio de nombres para el código que ha generado y haga clic en el botón Aceptar.

Ejemplo

El ejemplo de código siguiente muestra un contrato de servicio creado para un servicio.

// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    // Other methods are not shown here.
}
' Define a service contract.
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
    <OperationContract()>  _
    Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
    ' Other methods are not shown here.
End Interface

El uso de la herramienta de utilidad de metadatos de ServiceModel y el diálogo Agregar referencia de servicio en Visual Studio provoca que se genere la siguiente clase de cliente WCF. La clase adquiere de la clase ClientBase<TChannel> genérica e implementa la interfaz ICalculator. La herramienta también genera la interfaz (no se muestra aquí) ICalculator.

public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
{
    public CalculatorClient()
    {}

    public CalculatorClient(string endpointConfigurationName) :
            base(endpointConfigurationName)
    {}

    public CalculatorClient(string endpointConfigurationName, string remoteAddress) :
            base(endpointConfigurationName, remoteAddress)
    {}

    public CalculatorClient(string endpointConfigurationName,
        System.ServiceModel.EndpointAddress remoteAddress) :
            base(endpointConfigurationName, remoteAddress)
    {}

    public CalculatorClient(System.ServiceModel.Channels.Binding binding,
        System.ServiceModel.EndpointAddress remoteAddress) :
            base(binding, remoteAddress)
    {}

    public double Add(double n1, double n2)
    {
        return base.Channel.Add(n1, n2);
    }
}
Partial Public Class CalculatorClient
    Inherits System.ServiceModel.ClientBase(Of ICalculator)
    Implements ICalculator

    Public Sub New()
        MyBase.New
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String)
        MyBase.New(endpointConfigurationName)
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String,
        ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub

    Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding,
        ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(binding, remoteAddress)
    End Sub

    Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
        Implements ICalculator.Add
        Return MyBase.Channel.Add(n1, n2)
    End Function
End Class

Uso del cliente WCF

Para usar el cliente WCF, cree una instancia de este y llame a sus métodos, tal y como se muestra en el siguiente código.

// Create a client object with the given client endpoint configuration.
CalculatorClient calcClient = new CalculatorClient("CalculatorEndpoint");
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = calcClient.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
' Create a client object with the given client endpoint configuration.
Dim calcClient As CalculatorClient = _
New CalculatorClient("CalculatorEndpoint")

' Call the Add service operation.
Dim value1 As Double = 100.00D
Dim value2 As Double = 15.99D
Dim result As Double = calcClient.Add(value1, value2)
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)

Depuración de las excepciones iniciadas por un cliente

Muchas de las excepciones que inician los clientes WCF tienen su origen en una excepción del servicio. A continuación se indican algunos ejemplos:

  • SocketException: el host remoto forzó el cierre de la conexión existente.

  • CommunicationException: la conexión ha terminado de forma inesperada.

  • CommunicationObjectAbortedException: se anuló la conexión de socket. La causa puede ser un error en el procesamiento del mensaje, que se superó el tiempo de espera de recepción en el host remoto, o bien un problema de recursos de red subyacente.

Cuando se producen estos tipos de excepciones, la mejor manera de resolver el problema es activar el seguimiento en el lado del servicio y determinar qué excepción se produjo allí. Para obtener más información sobre los mecanismos de seguimiento, consulte Seguimiento y Uso del seguimiento para solucionar problemas de la aplicación.

Consulte también