Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das ServiceModel Metadata Utility Tool (Svcutil.exe) generiert Clientcode und eine Clientanwendungskonfigurationsdatei zum Erstellen von Clientanwendungen. Dieses Thema enthält eine Übersicht über generierte Codebeispiele für Standard-Dienstvertragsszenarien. Weitere Informationen zum Erstellen einer Clientanwendung mithilfe des generierten Codes finden Sie unter WCF Client Overview.
Überblick
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 dieselben Dienste für Sie ausführt, können Sie ein Tool wie Svcutil.exe verwenden, um Clientcode zu generieren und diesen Code dann zum Entwickeln Ihrer Clientanwendung zu verwenden.
Da Svcutil.exe über eine Reihe von Optionen verfügt, die die generierten Typinformationen ändern, werden in diesem Thema nicht alle Szenarien behandelt. Die folgenden Standardaufgaben umfassen jedoch das Auffinden von generierten Code:
Identifizieren von Dienstvertragsschnittstellen.
Identifizieren der WCF-Clientklasse.
Identifizieren von Datentypen.
Das Identifizieren von Rückrufverträgen für Duplexdienste.
Das Identifizieren der Hilfsdienstvertrag-Kanalschnittstelle.
Suchen von Servicevertragsschnittstellen
Um die Schnittstellen zu finden, die Serviceverträge modellieren, suchen Sie nach Schnittstellen, die mit dem System.ServiceModel.ServiceContractAttribute Attribut gekennzeichnet sind. Häufig kann dieses Attribut aufgrund des Vorhandenseins anderer Attribute und der expliziten Eigenschaften, die für das Attribut selbst festgelegt wurden, schwer zu finden sein. Denken Sie daran, dass die Dienstvertragsschnittstelle und die Clientvertragsschnittstelle zwei verschiedene Typen sind. Das folgende Codebeispiel zeigt den ursprünglichen Dienstvertrag.
[ServiceContractAttribute(
Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
[OperationContractAttribute]
[FaultContractAttribute(typeof(microsoft.wcf.documentation.SampleFault))]
string SampleMethod(string msg);
}
Das folgende Codebeispiel zeigt den gleichen Dienstvertrag wie von Svcutil.exegeneriert.
[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 Dienstvertragsschnittstelle zusammen mit der System.ServiceModel.ChannelFactory Klasse verwenden, um ein WCF-Kanalobjekt zu erstellen, mit dem Dienstvorgänge aufgerufen werden. Weitere Informationen finden Sie unter How to: Use the ChannelFactory.
Suchen nach WCF-Clientklassen
Um die WCF-Clientklasse zu finden, die den zu verwendenden Dienstvertrag implementiert, suchen Sie nach einer Erweiterung von System.ServiceModel.ClientBase<TChannel>, wobei der Typparameter die Dienstvertragsschnittstelle ist, die Sie zuvor gefunden haben und die diese Schnittstelle erweitert. Das folgende Codebeispiel zeigt die ClientBase<TChannel> Klasse des Typs 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 die implementierten Methoden aufrufen. Diese Methoden rufen den Dienstvorgang auf, mit dem er für die Interaktion konzipiert und konfiguriert ist. Weitere Informationen finden Sie unter WCF-Clientübersicht.
Hinweis
Wenn SvcUtil.exe eine WCF-Clientklasse generiert, wird der Clientklasse eine DebuggerStepThroughAttribute Hinzugefügt, die verhindert, dass Debugger die WCF-Clientklasse durchlaufen.
Suchen nach Datentypen
Um Datentypen im generierten Code zu finden, besteht der grundlegendste Mechanismus darin, den in einem Vertrag angegebenen Typnamen zu identifizieren und den Code für diese Typdeklaration zu durchsuchen. 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 gefunden.
[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 Serviceverträ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 Servicevertrag finden, für den die Vertragsschnittstelle einen Wert für die ServiceContractAttribute.CallbackContract Eigenschaft angibt, gibt dieser Vertrag einen Duplex-Vertrag an. Duplexverträge erfordern, dass die Clientanwendung eine Rückrufklasse erstellt, die den Rückrufvertrag implementiert, und eine Instanz dieser Klasse entweder an System.ServiceModel.DuplexClientBase<TChannel> oder System.ServiceModel.DuplexChannelFactory<TChannel> übergibt, die zur Kommunikation mit dem Dienst verwendet werden. Weitere Informationen zu Duplexclients finden Sie unter Wie Sie: Dienste mit einem Duplexvertrag nutzen.
Der folgende Vertrag gibt einen Rückruf-Vertrag 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
Bei der Suche nach diesem Rückrufvertrag wird die folgende Schnittstelle gefunden, die von der Clientanwendung implementiert werden 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 nach Dienstvertragskanalschnittstellen
Wenn Sie die ChannelFactory Klasse mit einer Dienstvertragsschnittstelle verwenden, müssen Sie zur System.ServiceModel.IClientChannel Schnittstelle umwandeln, 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. Der folgende Code zeigt die Definition eines Hilfsclientkanals, der den vorherigen Dienstvertrag implementiert.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}