Grundlagen des generierten ClientcodesUnderstanding Generated Client Code

Mit dem ServiceModel Metadata Utility Tool (Svcutil.exe) werden Clientcode und eine Clientanwendungs-Konfigurationsdatei zum Erstellen von Clientanwendungen generiert.The ServiceModel Metadata Utility Tool (Svcutil.exe) generates client code and a client application configuration file for use in building client applications. Dieses Thema bietet Beispiele für generierten Code für standardmäßige Dienstvertragszenarien.This topic provides a tour of generated code examples for standard service contract scenarios. Weitere Informationen zum Erstellen einer Clientanwendung, die mit dem generierten Code finden Sie unter Überblick über WCF-Client.For more information about building a client application using the generated code, see WCF Client Overview.

ÜbersichtOverview

Wenn Sie Visual Studio verwenden, um Windows Communication Foundation (WCF)-Clienttypen für Ihr Projekt zu generieren, in der Regel müssen nicht Sie den generierten Clientcode untersuchen.If you use Visual Studio to generate Windows Communication Foundation (WCF) client types for your project, you typically do not need to examine the generated client code. 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.If you are not using a development environment that performs the same services for you, you can use a tool such as Svcutil.exe to generate client code and then use that code to develop your client application.

Da Svcutil.exe über mehrere Optionen zum Ändern der generierten Typinformationen verfügt, werden in diesem Thema nicht alle Szenarien erläutert.Because Svcutil.exe has a number of options that modify the generated type information, this topic does not discuss all scenarios. Die folgenden Standardaufgaben schließen jedoch die Suche nach generiertem Code ein:However, the following standard tasks involve locating generated code:

  • Das Identifizieren von Dienstvertragsschnittstellen.Identifying service contract interfaces.

  • Identifizieren die WCF-Clientklasse.Identifying the WCF client class.

  • Das Identifizieren von Datentypen.Identifying data types.

  • Das Identifizieren von Rückrufverträgen für Duplexdienste.Identifying callback contracts for duplex services.

  • Das Identifizieren der Hilfsdienstvertrag-Kanalschnittstelle.Identifying the helper service contract channel interface.

Das Suchen von Dienstvertragschnittstellen.Finding Service Contract Interfaces

Suchen Sie bei der Suche nach Schnittstellen für Dienstvertragmodelle mit dem System.ServiceModel.ServiceContractAttribute-Attribut markierte Schnittstellen.To locate the interfaces that model service contracts, search for interfaces that are marked with the System.ServiceModel.ServiceContractAttribute attribute. 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.Often this attribute can be difficult to locate with a quick read due to the presence of other attributes and the explicit properties set on the attribute itself. Beachten Sie, dass die Dienstvertragschnittstelle und die Clientvertragschnittstelle zwei verschiedene Typen sind.Remember that the service contract interface and the client contract interface are two different types. Im folgenden Codebeispiel wird der ursprüngliche Dienstvertrag gezeigt.The following code example shows the original service contract.

[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.The following code example shows the same service contract as generated by 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);
}

Sie können die generierte dienstvertragschnittstelle zusammen mit der System.ServiceModel.ChannelFactory Klasse zum Erstellen eines WCF-Kanal-Objekts mit dem Dienstvorgänge aufzurufen.You can use the generated service contract interface along with the System.ServiceModel.ChannelFactory class to create a WCF channel object with which to invoke service operations. Weitere Informationen finden Sie unter Vorgehensweise: Verwenden der ChannelFactory.For more information, see How to: Use the ChannelFactory.

Suchen von WCF-ClientklassenFinding WCF Client Classes

Um die WCF-Clientklasse zu suchen, die den Dienstvertrag implementiert, Sie verwenden möchten, suchen Sie nach einer Erweiterung von System.ServiceModel.ClientBase<TChannel>, wobei der Typparameter die dienstvertragschnittstelle ist, die Sie zuvor gefunden haben und die diese Schnittstelle erweitert.To locate the WCF client class that implements the service contract you want to use, search for an extension of System.ServiceModel.ClientBase<TChannel>, where the type parameter is the service contract interface that you previously located and that extends that interface. Im folgenden Codebeispiel wird die ClientBase<TChannel> -Klasse vom Typ ISampleServicegezeigt.The following code example shows the ClientBase<TChannel> class of 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);
    }
}

Sie können diese WCF-Clientklasse verwenden, indem Sie eine neue Instanz davon erstellen und Aufrufen der Methoden implementiert.You can use this WCF client class by creating a new instance of it and calling the methods it implements. Diese Methoden rufen den Dienstvorgang auf, der für die Interaktion mit ihr konzipiert und konfiguriert ist.Those methods invoke the service operation with which it is designed and configured to interact. Weitere Informationen finden Sie unter Überblick über WCF-Client.For more information, see WCF Client Overview.

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.When SvcUtil.exe generates a WCF client class, it adds a DebuggerStepThroughAttribute to the client class that prevents debuggers from stepping through the WCF client class.

Suchen von DatentypenFinding Data Types

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.To locate data types in the generated code, the most basic mechanism is to identify the type name specified in a contract and search the code for that type declaration. Zum Beispiel gibt der folgende Vertrag an, dass SampleMethod einen SOAP-Fehler des Typs microsoft.wcf.documentation.SampleFaultzurückgeben kann.For example, the following contract specifies that the SampleMethod can return a SOAP fault of 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);

Durch die Suche nach SampleFault wird die folgende Typdeklaration gesucht.Searching for SampleFault locates the following type declaration.

[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.In this case the data type is the detail type thrown by a specific exception on the client, a FaultException<TDetail> where the detail type parameter is microsoft.wcf.documentation.SampleFault. Weitere Informationen zu Datentypen finden Sie unter angeben von Datenübertragung in Dienstverträgen.For more information about data types, see Specifying Data Transfer in Service Contracts. Weitere Informationen zur Behandlung von Ausnahmen in Clients finden Sie unter senden und Empfangen von Fehlern.For more information about handling exceptions in clients, see Sending and Receiving Faults.

Suchen von Rückrufverträgen für DuplexdiensteFinding Callback Contracts for Duplex Services

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.If you locate a service contract for which the contract interface specifies a value for the ServiceContractAttribute.CallbackContract property, then that contract specifies a duplex contract. 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.Duplex contracts require the client application to create a callback class that implements the callback contract and pass an instance of that class to the System.ServiceModel.DuplexClientBase<TChannel> or System.ServiceModel.DuplexChannelFactory<TChannel> used to communicate with the service. Weitere Informationen zu duplexclients finden Sie unter Vorgehensweise: Access Services mit einem Duplexvertrag.For more information about duplex clients, see How to: Access Services with a Duplex Contract.

Der folgende Vertrag gibt einen Rückrufvertrag vom Typ SampleDuplexHelloCallbackan.The following contract specifies a callback contract of 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

Durch die Suche nach diesem Rückrufvertrag wird die folgende Schnittstelle gesucht, die die Clientanwendung implementieren muss.Searching for that callback contract locates the following interface that the client application must implement.

  [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-KanalschnittstellenFinding Service Contract Channel Interfaces

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.When using the ChannelFactory class with a service contract interface, you must cast to the System.ServiceModel.IClientChannel interface to explicitly open, close, or abort the channel. 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.To make it easier to work with, the Svcutil.exe tool also generates a helper interface that implements both the service contract interface and IClientChannel to enable you to interact with the client channel infrastructure without having to cast. Im folgenden Code wird die Definition eines Hilfsclientkanals, der den vorangehenden Dienstvertrag implementiert, veranschaulicht.The following code shows the definition of a helper client channel that implements the preceding service contract.

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

Siehe auchSee Also

Übersicht über den WCF-ClientWCF Client Overview