Grundlagen des generierten Clientcodes

Mit dem ServiceModel Metadata Utility Tool (Svcutil.exe) werden Clientcode und eine Clientanwendungs-Konfigurationsdatei zum Erstellen von Clientanwendungen generiert. Dieses Thema bietet Beispiele für generierten Code für standardmäßige Dienstvertragszenarien. Weitere Informationen zum Erstellen einer Clientanwendung mithilfe des generierten Codes finden Sie unter WCF Client Overview.

Übersicht

Wenn Sie Visual Studio zum Generieren von Windows-Communication-Foundation-(WCF)-Clienttypen für Ihr Projekt verwenden, müssen Sie normalerweise nicht den generierten Clientcode untersuchen. Wenn Sie keine Entwicklungsumgebung verwenden, die die gleichen Dienste für Sie ausführt, können Sie mit einem Tool wie Svcutil.exe Clientcode generieren und dann mithilfe dieses Codes die Clientanwendung erstellen.

Da Svcutil.exe über mehrere Optionen zum Ändern der generierten Typinformationen verfügt, werden in diesem Thema nicht alle Szenarien erläutert. Die folgenden Standardaufgaben schließen jedoch die Suche nach generiertem Code ein:

  • Das Identifizieren von Dienstvertragsschnittstellen.

  • Identifizieren der WCF-Clientklasse.

  • Das Identifizieren von Datentypen.

  • Das Identifizieren von Rückrufverträgen für Duplexdienste.

  • Das Identifizieren der Hilfsdienstvertrag-Kanalschnittstelle.

Das Suchen von Dienstvertragschnittstellen.

Suchen Sie bei der Suche nach Schnittstellen für Dienstvertragmodelle mit dem System.ServiceModel.ServiceContractAttribute -Attribut markierte Schnittstellen. Die Suche nach diesem Attribute mit schnellem Lesen kann wegen des Vorhandenseins anderer Attribute und der für das Attribut selbst festgelegten expliziten Eigenschaften häufig schwierig sein. Beachten Sie, dass die Dienstvertragschnittstelle und die Clientvertragschnittstelle zwei verschiedene Typen sind. Im folgenden Codebeispiel wird der ursprüngliche Dienstvertrag gezeigt.

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

Im folgenden Codebeispiel wird der gleiche Dienstvertrag gezeigt, wie von Svcutil.exe generiert.

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

Sie können die generierte Dienstvertragschnittstelle zusammen mit der System.ServiceModel.ChannelFactoryKlasse zum Erstellen eines WCF-Kanalobjekts für das Aufrufen von Dienstvorgängen verwenden. Weitere Informationen finden Sie unter Vorgehensweise: Verwenden der ChannelFactory.

Suchen von WCF-Clientklassen

Suchen Sie bei der Suche nach der WCF-Clientklasse, die den zu verwendenden Dienstvertrag implementiert, nach einer Erweiterung von System.ServiceModel.ClientBase<TChannel>, wobei der Typparameter die Dienstvertragschnittstelle ist, die Sie zuvor gefunden haben und die diese Schnittstelle erweitert. Im folgenden Codebeispiel wird die ClientBase<TChannel> -Klasse vom Typ ISampleServicegezeigt.

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

Sie können diese WCF-Clientklasse verwenden, indem Sie eine neue Instanz davon erstellen und die Methoden aufrufen, die sie implementiert. Diese Methoden rufen den Dienstvorgang auf, der für die Interaktion mit ihr konzipiert und konfiguriert ist. Weitere Informationen finden Sie unter WCF-Client-Übersicht.

Hinweis

Wenn SvcUtil.exe eine WCF-Clientklasse generiert, wird ihr ein DebuggerStepThroughAttribute hinzugefügt, das die schrittweise Ausführung der WCF-Clientklasse durch Debugger verhindert.

Suchen von Datentypen

Die grundlegendste Methode zum Suchen von Datentypen im generierten Code ist die Identifizierung des in einem Vertrag angegebenen Typnamens und die Suche des Codes für diese Typdeklaration. Zum Beispiel gibt der folgende Vertrag an, dass SampleMethod einen SOAP-Fehler des Typs microsoft.wcf.documentation.SampleFaultzurückgeben kann.

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

Durch die Suche nach SampleFault wird die folgende Typdeklaration gesucht.

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

In diesem Fall ist der Datentyp der durch eine bestimmte Ausnahme auf dem Client ausgelöste Detailtyp, eine FaultException<TDetail> , wobei der Detailtypparameter microsoft.wcf.documentation.SampleFaultist. Weitere Informationen zu Datentypen finden Sie unter Angeben der Datenübertragung in Dienstverträgen. Weitere Informationen zum Behandeln von Ausnahmen in Clients finden Sie unter Senden und Empfangen von Fehlern.

Suchen von Rückrufverträgen für Duplexdienste

Wenn Sie einen Dienstvertrag finden, bei dem die Vertragschnittstelle einen Wert für die ServiceContractAttribute.CallbackContract -Eigenschaft angibt, dann gibt dieser Vertrag einen Duplexvertrag an. Duplexverträge erfordern, dass die Clientanwendung eine Rückrufklasse erstellt, die den Rückrufvertrag implementiert und eine Instanz dieser Klasse an System.ServiceModel.DuplexClientBase<TChannel> oder System.ServiceModel.DuplexChannelFactory<TChannel> zur Kommunikation mit dem Dienst übergibt. Weitere Informationen zu Duplexclients finden Sie unter Vorgehensweise: Zugreifen auf Dienste mit einem Duplexvertrag.

Der folgende Vertrag gibt einen Rückrufvertrag vom Typ SampleDuplexHelloCallbackan.

[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

Durch die Suche nach diesem Rückrufvertrag wird die folgende Schnittstelle gesucht, die die Clientanwendung implementieren muss.

  [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

Suchen von Dienstvertrag-Kanalschnittstellen

Beim Verwenden der ChannelFactory -Klasse mit einer Dienstvertragschnittstelle muss diese in eine System.ServiceModel.IClientChannel -Schnittstelle umgewandelt werden, um den Kanal explizit zu öffnen, zu schließen oder abzubrechen. Zum Erleichtern der Arbeit generiert das Tool Svcutil.exe auch eine Hilfsschnittstelle, die die Dienstvertragschnittstelle und IClientChannel implementiert, wodurch die Interaktion mit der Clientkanalinfrastruktur ohne Umwandlung ermöglicht wird. Im folgenden Code wird die Definition eines Hilfsclientkanals, der den vorangehenden Dienstvertrag implementiert, veranschaulicht.

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

Siehe auch