Partager via


Présentation du code client généré

L’outil Utilitaire de métadonnées ServiceModel (Svcutil.exe) génère du code client et un fichier de configuration d’application cliente à utiliser dans la création d’applications clientes. Cette rubrique fournit une visite guidée des exemples de code générés pour les scénarios de contrat de service standard. Pour plus d’informations sur la création d’une application cliente à l’aide du code généré, consultez Vue d’ensemble du client WCF.

Aperçu

Si vous utilisez Visual Studio pour générer des types de client Windows Communication Foundation (WCF) pour votre projet, vous n’avez généralement pas besoin d’examiner le code client généré. Si vous n’utilisez pas d’environnement de développement qui effectue les mêmes services pour vous, vous pouvez utiliser un outil tel que Svcutil.exe pour générer du code client, puis utiliser ce code pour développer votre application cliente.

Étant donné que Svcutil.exe dispose d’un certain nombre d’options qui modifient les informations de type générées, cette rubrique ne traite pas de tous les scénarios. Toutefois, les tâches standard suivantes impliquent la localisation du code généré :

  • Identification des interfaces de contrat de service.

  • Identification de la classe cliente WCF.

  • Identification des types de données.

  • Identification des contrats de rappel pour les services duplex.

  • Identification de l'interface de canal de contrat de service d'assistance.

Recherche d’interfaces de contrat de service

Pour localiser les interfaces qui modélisent les contrats de service, recherchez les interfaces marquées avec l’attribut System.ServiceModel.ServiceContractAttribute . Souvent, cet attribut peut être difficile à localiser avec une lecture rapide en raison de la présence d’autres attributs et des propriétés explicites définies sur l’attribut lui-même. N’oubliez pas que l’interface de contrat de service et l’interface de contrat client sont deux types différents. L’exemple de code suivant montre le contrat de service d’origine.

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

L’exemple de code suivant montre le même contrat de service que celui généré par 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);
}

Vous pouvez utiliser l’interface de contrat de service générée avec la System.ServiceModel.ChannelFactory classe pour créer un objet de canal WCF avec lequel appeler des opérations de service. Pour plus d’informations, consultez Guide pratique pour utiliser ChannelFactory.

Recherche de classes clientes WCF

Pour localiser la classe cliente WCF qui implémente le contrat de service que vous souhaitez utiliser, recherchez une extension de , où le paramètre de System.ServiceModel.ClientBase<TChannel>type est l’interface de contrat de service que vous avez précédemment localisée et qui étend cette interface. L’exemple de code suivant montre la ClientBase<TChannel> classe de type 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);
    }
}

Vous pouvez utiliser cette classe cliente WCF en créant une instance de celle-ci et en appelant les méthodes qu’elle implémente. Ces méthodes appellent l’opération de service avec laquelle elle est conçue et configurée pour interagir. Pour plus d’informations, consultez Vue d’ensemble du client WCF.

Remarque

Lorsque SvcUtil.exe génère une classe de client WCF, il ajoute un DebuggerStepThroughAttribute à la classe de client qui empêche les débogueurs de parcourir pas à pas la classe de client WCF.

Recherche de types de données

Pour localiser les types de données dans le code généré, le mécanisme le plus simple consiste à identifier le nom de type spécifié dans un contrat et à rechercher le code de cette déclaration de type. Par exemple, le contrat suivant spécifie que le SampleMethod peut retourner une erreur SOAP de type 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);

La recherche de SampleFault localise la déclaration de type suivante.

[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;
            }
        }
    }
}

Dans ce cas, le type de données est le type de données détaillées provoqué par une exception spécifique sur le client, FaultException<TDetail> où le paramètre de type de détail est microsoft.wcf.documentation.SampleFault. Pour plus d’informations sur les types de données, consultez Spécification du transfert de données dans les contrats de service. Pour plus d’informations sur la gestion des exceptions dans les clients, consultez Envoi et réception d’erreurs.

Recherche de contrats de rappel pour les services duplex

Si vous localisez un contrat de service pour lequel l’interface de contrat spécifie une valeur pour la ServiceContractAttribute.CallbackContract propriété, ce contrat spécifie un contrat duplex. Les contrats duplex exigent que l'application cliente crée une classe de rappel qui implémente le contrat de rappel, et passe une instance de cette classe à l'un des composants System.ServiceModel.DuplexClientBase<TChannel> ou System.ServiceModel.DuplexChannelFactory<TChannel> utilisés pour communiquer avec le service. Pour plus d’informations sur les clients duplex, consultez Guide pratique pour accéder aux services avec un contrat duplex.

Le contrat suivant spécifie un contrat de rappel de type 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

La recherche de ce contrat de rappel recherche l’interface suivante que l’application cliente doit implémenter.

  [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

Recherche d'interfaces de canal de contrat de service

Lorsque vous utilisez la ChannelFactory classe avec une interface de contrat de service, vous devez effectuer un cast vers l’interface System.ServiceModel.IClientChannel pour ouvrir, fermer ou abandonner explicitement le canal. Pour faciliter son utilisation, l'outil Svcutil.exe génère également une interface d'assistance qui implémente à la fois l'interface de contrat de service et IClientChannel afin de vous permettre d'interagir avec l'infrastructure de canal client sans devoir convertir de type. Le code suivant montre la définition d’un canal client d’assistance qui implémente le contrat de service précédent.

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

Voir aussi