Inzicht in gegenereerde clientcode
Het hulpprogramma hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) genereert clientcode en een configuratiebestand voor clienttoepassingen voor gebruik in het bouwen van clienttoepassingen. In dit onderwerp vindt u een rondleiding door gegenereerde codevoorbeelden voor standaardscenario's voor servicecontractscenario's. Zie wcF-clientoverzicht voor meer informatie over het bouwen van een clienttoepassing met behulp van de gegenereerde code.
Overzicht
Als u Visual Studio gebruikt om WCF-clienttypen (Windows Communication Foundation) voor uw project te genereren, hoeft u doorgaans de gegenereerde clientcode niet te onderzoeken. Als u geen ontwikkelomgeving gebruikt die dezelfde services voor u uitvoert, kunt u een hulpprogramma zoals Svcutil.exe gebruiken om clientcode te genereren en die code vervolgens te gebruiken om uw clienttoepassing te ontwikkelen.
Omdat Svcutil.exe een aantal opties heeft waarmee de gegenereerde typegegevens worden gewijzigd, worden in dit onderwerp niet alle scenario's besproken. Bij de volgende standaardtaken moet u echter gegenereerde code zoeken:
Servicecontractinterfaces identificeren.
De WCF-clientklasse identificeren.
Gegevenstypen identificeren.
Callbackcontracten voor duplex-services identificeren.
De interface van het helperservicecontract identificeren.
Servicecontractinterfaces zoeken
Als u de interfaces wilt zoeken die servicecontracten modelleren, zoekt u naar interfaces die zijn gemarkeerd met het System.ServiceModel.ServiceContractAttribute kenmerk. Dit kenmerk kan vaak moeilijk te vinden zijn met een snelle leesbewerking vanwege de aanwezigheid van andere kenmerken en de expliciete eigenschappen die zijn ingesteld op het kenmerk zelf. Houd er rekening mee dat de interface van het servicecontract en de interface van het clientcontract twee verschillende typen zijn. In het volgende codevoorbeeld ziet u het oorspronkelijke servicecontract.
[ServiceContractAttribute(
Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
[OperationContractAttribute]
[FaultContractAttribute(typeof(microsoft.wcf.documentation.SampleFault))]
string SampleMethod(string msg);
}
In het volgende codevoorbeeld ziet u hetzelfde servicecontract als gegenereerd door 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);
}
U kunt de gegenereerde servicecontractinterface samen met de System.ServiceModel.ChannelFactory klasse gebruiken om een WCF-kanaalobject te maken waarmee servicebewerkingen kunnen worden aangeroepen. Zie How to: Use the ChannelFactory voor meer informatie.
WCF-clientklassen zoeken
Als u de WCF-clientklasse wilt vinden die het servicecontract implementeert dat u wilt gebruiken, zoekt u naar een extensie van System.ServiceModel.ClientBase<TChannel>, waarbij de typeparameter de servicecontractinterface is die u eerder hebt gevonden en die die interface uitbreidt. In het volgende codevoorbeeld ziet u de klasse van het ClientBase<TChannel> 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);
}
}
U kunt deze WCF-clientklasse gebruiken door een nieuw exemplaar ervan te maken en de methoden aan te roepen die worden geïmplementeerd. Deze methoden roepen de servicebewerking aan waarmee deze is ontworpen en geconfigureerd om te communiceren. Zie wcf-clientoverzicht voor meer informatie.
Notitie
Wanneer SvcUtil.exe een WCF-clientklasse genereert, wordt er een DebuggerStepThroughAttribute toegevoegd aan de clientklasse die voorkomt dat foutopsporingsprogramma's de WCF-clientklasse doorlopen.
Gegevenstypen zoeken
Om gegevenstypen in de gegenereerde code te vinden, is het meest elementaire mechanisme om de typenaam te identificeren die is opgegeven in een contract en de code voor die typedeclaratie te doorzoeken. In het volgende contract wordt bijvoorbeeld aangegeven dat de SampleMethod
SOAP-fout van het type microsoft.wcf.documentation.SampleFault
kan worden geretourneerd.
[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);
SampleFault
Zoeken naar de volgende typedeclaratie.
[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 dit geval is het gegevenstype het detailtype dat wordt gegenereerd door een specifieke uitzondering op de client, een FaultException<TDetail> locatie waar de parameter voor het detailtype is microsoft.wcf.documentation.SampleFault
. Zie Gegevensoverdracht opgeven in servicecontracten voor meer informatie over gegevenstypen. Zie Verzenden en ontvangen van fouten voor meer informatie over het verwerken van uitzonderingen in clients.
Callback-contracten voor duplexservices zoeken
Als u een servicecontract zoekt waarvoor de contractinterface een waarde voor de ServiceContractAttribute.CallbackContract eigenschap opgeeft, geeft dat contract een dubbelzijdig contract op. Dubbelzijdige contracten vereisen dat de clienttoepassing een callback-klasse maakt die het callback-contract implementeert en een exemplaar van die klasse doorgeeft aan de System.ServiceModel.DuplexClientBase<TChannel> of System.ServiceModel.DuplexChannelFactory<TChannel> wordt gebruikt om met de service te communiceren. Zie How to: Access Services with a Duplex Contract(s) voor meer informatie over duplex-clients.
In het volgende contract wordt een callbackcontract van het type SampleDuplexHelloCallback
opgegeven.
[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
Als u zoekt naar dat callback-contract, wordt de volgende interface gevonden die de clienttoepassing moet implementeren.
[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
Servicecontractkanaalinterfaces zoeken
Wanneer u de ChannelFactory klasse met een servicecontractinterface gebruikt, moet u naar de System.ServiceModel.IClientChannel interface casten om het kanaal expliciet te openen, te sluiten of af te breken. Om het gemakkelijker te maken om mee te werken, genereert het hulpprogramma Svcutil.exe ook een helperinterface waarmee zowel de interface van het servicecontract wordt geïmplementeerd als IClientChannel waarmee u kunt communiceren met de infrastructuur van het clientkanaal zonder dat u hoeft te casten. De volgende code toont de definitie van een helper-clientkanaal waarmee het voorgaande servicecontract wordt geïmplementeerd.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}