Comprender códigos de cliente generado

ServiceModel Metadata Utility Tool (Svcutil.exe) genera código de cliente y un archivo de configuración de la aplicación cliente para su uso en la compilación de aplicaciones cliente. Este tema proporciona un recorrido por los ejemplos de código generados para los escenarios de contrato de servicio estándar. Para obtener más información sobre cómo compilar una aplicación cliente mediante el código generado, consulte Introducción a un cliente WCF.

Información general

Si utiliza Visual Studio para generar los tipos de cliente de la aplicación Windows Communication Foundation (WCF) para su proyecto, normalmente, no necesita examinar el código de cliente generado. Si no usa un entorno de desarrollo que realice los mismos servicios automáticamente, puede usar una herramienta como Svcutil.exe para generar el código de cliente y, a continuación, usar ese código para desarrollar la aplicación cliente.

Dado que Svcutil.exe tiene varias opciones que modifican la información de tipo generada, este tema no discute todos los escenarios. Sin embargo, las tareas estándar siguientes implican la ubicación del código generado:

  • Identificar las interfaces del contrato de servicio.

  • Identificar la clase de cliente WCF.

  • Identificar los tipos de datos.

  • Identificar los contratos de devolución de llamada para los servicios dúplex.

  • Identificar la interfaz de canal de contrato de servicio del asistente.

Buscar las interfaces del contrato de servicio

Buscar las interfaces que modelan los servicios modelo, buscar las interfaces marcadas con el atributo System.ServiceModel.ServiceContractAttribute . A menudo este atributo puede ser difícil de buscar con una lectura rápida debido a la presencia de otros atributos y las propiedades explícitas establecidas en el propio atributo. Recuerde que la interfaz del contrato de servicio y la interfaz del contrato del cliente son dos tipos diferentes. El ejemplo de código siguiente muestra el contrato de servicios original.

[ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
  [OperationContractAttribute]
  [FaultContractAttribute(typeof(microsoft.wcf.documentation.SampleFault))]
  string SampleMethod(string msg);
}

El ejemplo de código siguiente muestra el mismo contrato de servicios tal y como lo genera Svcutil.exe.

[System.ServiceModel.ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
    [System.ServiceModel.OperationContractAttribute(
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
      ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
    )]
    [System.ServiceModel.FaultContractAttribute(
      typeof(microsoft.wcf.documentation.SampleFault),
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
    )]
    string SampleMethod(string msg);
}

Puede utilizar la interfaz del contrato de servicio generada junto con la clase System.ServiceModel.ChannelFactory para crear un objeto de canal de WCF con el que invocar las operaciones del servicio. Para obtener más información, consulte Procedimiento para usar ChannelFactory.

Buscar las clases de cliente de WCF

Para buscar la clase de cliente WCF que implementa el contrato de servicio que usted quiere utilizar, busque una extensión de System.ServiceModel.ClientBase<TChannel>, donde el parámetro de tipo es la interfaz del contrato de servicio que usted ha buscado previamente y que extiende esa interfaz. En el ejemplo de código siguiente se muestra la clase ClientBase<TChannel> de tipo ISampleService.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class SampleServiceClient : System.ServiceModel.ClientBase<ISampleService>, ISampleService
{

    public SampleServiceClient()
    {
    }

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

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

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

    public SampleServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress)
        :
            base(binding, remoteAddress)
    {
    }
    public string SampleMethod(string msg)
    {
        return base.Channel.SampleMethod(msg);
    }
}

Puede utilizar esta clase de cliente WCF creando una nueva instancia de esta y llamando a los métodos que implementa. Esos métodos invocan la operación del servicio con la que está diseñado y está configurado para interactuar. Para obtener más información, consulte Introducción a un cliente WCF.

Nota

Cuando SvcUtil.exe genera una clase de cliente WCF, agrega DebuggerStepThroughAttribute a la clase de cliente para evitar que los depuradores recorran la clase de cliente WCF.

Buscar los tipos de datos

Para encontrar los tipos de datos en el código generado, el mecanismo más básico es identificar el nombre del tipo especificado en un contrato y buscar el código para esa declaración de tipos. Por ejemplo, el contrato siguiente especifica que SampleMethod puede devolver un error de SOAP de tipo microsoft.wcf.documentation.SampleFault.

[System.ServiceModel.OperationContractAttribute(
  Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
  ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
)]
[System.ServiceModel.FaultContractAttribute(
  typeof(microsoft.wcf.documentation.SampleFault),
  Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
)]
string SampleMethod(string msg);

Al buscar SampleFault , se busca la declaración de tipos siguiente.

[assembly: System.Runtime.Serialization.ContractNamespaceAttribute(
  "http://microsoft.wcf.documentation",
  ClrNamespace = "microsoft.wcf.documentation"
)]
namespace microsoft.wcf.documentation
{
    using System.Runtime.Serialization;

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute()]
    public partial class SampleFault : object, System.Runtime.Serialization.IExtensibleDataObject
    {
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
        private string FaultMessageField;

        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
        {
            get
            {
                return this.extensionDataField;
            }
            set
            {
                this.extensionDataField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute()]
        public string FaultMessage
        {
            get
            {
                return this.FaultMessageField;
            }
            set
            {
                this.FaultMessageField = value;
            }
        }
    }
}

En este caso, el tipo de datos es el tipo de datos iniciado por una excepción específica en el cliente, FaultException<TDetail> donde el parámetro de tipo de datos es microsoft.wcf.documentation.SampleFault. Para obtener más información sobre los tipos de datos, consulte Especificación de transferencia de datos en contratos de servicio. Para obtener más información sobre cómo controlar excepciones en clientes, consulte Envío y recepción de errores.

Buscar los contratos de devolución de llamada para los servicios dúplex

Si busca un contrato de servicios para el cual la interfaz de contrato especifica un valor para la propiedad ServiceContractAttribute.CallbackContract , a continuación, ese contrato especifica un contrato dúplex. Los contratos dúplex exigen a la aplicación cliente que cree una clase de devolución de llamada que implemente el contrato de devolución de llamada y pase una instancia de esa clase a System.ServiceModel.DuplexClientBase<TChannel> o System.ServiceModel.DuplexChannelFactory<TChannel> usando para comunicarse con el servicio. Para obtener más información sobre los clientes dúplex, consulte Acceso a servicios con un contrato dúplex.

El contrato siguiente especifica un contrato de devolución de llamada de tipo SampleDuplexHelloCallback.

[System.ServiceModel.ServiceContractAttribute(
  Namespace="http://microsoft.wcf.documentation",
  ConfigurationName="SampleDuplexHello",
  CallbackContract=typeof(SampleDuplexHelloCallback),
  SessionMode=System.ServiceModel.SessionMode.Required
)]
public interface SampleDuplexHello
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true,
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Hello"
    )]
    void Hello(string greeting);
  }
    <System.ServiceModel.OperationContractAttribute(IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Hello")> _
    Sub Hello(ByVal greeting As String)
End Interface 'SampleDuplexHello

Buscar ese contrato de devolución de llamada busca la interfaz siguiente que la aplicación cliente debe implementar.

  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface SampleDuplexHelloCallback
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true,
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Reply"
    )]
    void Reply(string responseToGreeting);
  }
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")>  _
Public Interface SampleDuplexHelloCallback
    <System.ServiceModel.OperationContractAttribute( _
        IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Reply")> _
    Sub Reply(ByVal responseToGreeting As String)
End Interface 'SampleDuplexHelloCallback

Buscar interfaces de canal de contrato de servicios

Al utilizar la clase ChannelFactory con una interfaz del contrato de servicios, debe convertirse a la interfaz System.ServiceModel.IClientChannel para abrir, cerrar, o anular el canal explícitamente. Para facilitar su funcionamiento, la herramienta Svcutil.exe también genera una interfaz del asistente que implementa la interfaz del contrato de servicio y IClientChannel para permitir que usted interactúe con la infraestructura del canal de cliente sin tener que convertirse. El código siguiente muestra la definición de un canal de cliente del asistente que implementa el contrato de servicios anterior.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

Consulte también