Compartir a través de


Descripción del código de cliente generado

La herramienta de utilidad de metadatos serviceModel (Svcutil.exe) genera código de cliente y un archivo de configuración de aplicación cliente para su uso en la creación de aplicaciones cliente. En este tema se proporciona un recorrido por los ejemplos de código generados para escenarios de contrato de servicio estándar. Para obtener más información sobre la creación de una aplicación cliente mediante el código generado, consulte Introducción al cliente WCF.

Información general

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

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

  • Identificación de interfaces de contrato de servicio.

  • Identificación de la clase de cliente WCF.

  • Identificación de 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.

Búsqueda de interfaces de contrato de servicio

Para buscar las interfaces que modelar contratos de servicio, busque interfaces marcadas con el System.ServiceModel.ServiceContractAttribute atributo . A menudo, este atributo puede ser difícil de localizar 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 de contrato de servicio y la interfaz de contrato de cliente son dos tipos diferentes. En el ejemplo de código siguiente se muestra el contrato de servicio original.

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

En el ejemplo de código siguiente se muestra el mismo contrato de servicio generado por 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 usar la interfaz de contrato de servicio generada junto con la System.ServiceModel.ChannelFactory clase para crear un objeto de canal WCF con el que invocar operaciones de servicio. Para obtener más información, vea Cómo: Usar ChannelFactory.

Búsqueda de clases de cliente de WCF

Para buscar la clase de cliente WCF que implementa el contrato de servicio que desea usar, busque una extensión de System.ServiceModel.ClientBase<TChannel>, donde el parámetro type es la interfaz de contrato de servicio que ha localizado anteriormente y que extiende esa interfaz. En el ejemplo de código siguiente se muestra la ClientBase<TChannel> clase 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 usar esta clase de cliente WCF mediante la creación de una nueva instancia de ella y la llamada a los métodos que implementa. Esos métodos invocan la operación de servicio con la que está diseñado y configurado para interactuar. Para obtener más información, consulte Introducción al 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.

Búsqueda de tipos de datos

Para buscar tipos de datos en el código generado, el mecanismo más básico es identificar el nombre de tipo especificado en un contrato y buscar el código para esa declaración de tipo. Por ejemplo, el siguiente contrato especifica que SampleMethod puede devolver un error 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);

Buscar SampleFault localiza la siguiente declaración de tipo.

[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 detalle lanzado por una excepción específica en el cliente, un FaultException<TDetail> donde el parámetro de tipo de detalle es microsoft.wcf.documentation.SampleFault. Para obtener más información sobre los tipos de datos, consulte Especificación de la transferencia de datos en los contratos de servicio. Para obtener más información sobre el control de excepciones en los 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, vea Cómo: Acceder 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 auxiliar que implementa el contrato de servicio anterior.

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

Consulte también