Procedure: Metagegevens ophalen en een compatibele service implementeren
Vaak ontwerpt en implementeert dezelfde persoon geen services. In omgevingen waar interoperabele toepassingen belangrijk zijn, kunnen contracten worden ontworpen of beschreven in WSDL (Web Services Description Language) en moet een ontwikkelaar een service implementeren die voldoet aan het geleverde contract. U kunt ook een bestaande service migreren naar WCF (Windows Communication Foundation), maar de draadindeling behouden. Daarnaast moeten ook dubbelzijdige contracten bellers een callback-contract implementeren.
In deze gevallen moet u het Hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) (of een gelijkwaardig hulpprogramma) gebruiken om een servicecontractinterface te genereren in een beheerde taal die u kunt implementeren om te voldoen aan de vereisten van het contract. Doorgaans wordt het hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) gebruikt om een servicecontract te verkrijgen dat wordt gebruikt met een kanaalfactory of een WCF-clienttype, evenals met een clientconfiguratiebestand waarmee de juiste binding en het juiste adres worden ingesteld. Als u het gegenereerde configuratiebestand wilt gebruiken, moet u dit wijzigen in een serviceconfiguratiebestand. Mogelijk moet u ook het servicecontract wijzigen.
Gegevens ophalen en een compatibele service implementeren
Gebruik het hulpprogramma hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) voor metagegevensbestanden of een eindpunt voor metagegevens om een codebestand te genereren.
Zoek naar het gedeelte van het uitvoercodebestand dat de interesse-interface bevat (voor het geval er meer dan één is) die is gemarkeerd met het System.ServiceModel.ServiceContractAttribute kenmerk. In het volgende codevoorbeeld ziet u de twee interfaces die zijn gegenereerd door het hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe). De eerste (
ISampleService
) is de servicecontractinterface die u implementeert om een compatibele service te maken. De tweede (ISampleServiceChannel
) is een helperinterface voor clientgebruik dat zowel de interface van het servicecontract uitbreidt als System.ServiceModel.IClientChannel voor gebruik in een clienttoepassing.[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [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); } [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel { }
Als de WSDL geen antwoordactie opgeeft voor alle bewerkingen, kan voor de gegenereerde bewerkingscontracten de ReplyAction eigenschap zijn ingesteld op het jokerteken (*). Verwijder deze eigenschapsinstelling. Als u de metagegevens van het servicecontract implementeert, kunnen de metagegevens niet worden geëxporteerd voor deze bewerkingen.
Implementeer de interface op een klasse en host de service. Zie Een voorbeeld : Een servicecontract implementeren of een eenvoudige implementatie hieronder bekijken in de sectie Voorbeeld.
Wijzig in het clientconfiguratiebestand dat het hulpprogramma servicemodelmetagegevenshulpprogramma (Svcutil.exe) genereert de< sectie clientconfiguratie> in een <serviceconfiguratiesectie>. (Zie de volgende sectie 'Voorbeeld' voor een voorbeeld van een gegenereerd configuratiebestand voor clienttoepassingen.)
Maak in de <sectie Services-configuratie> een
name
kenmerk in de <sectie Servicesconfiguratie> voor uw service-implementatie.Stel het servicekenmerk
name
in op de configuratienaam voor uw service-implementatie.Voeg de eindpuntconfiguratie-elementen toe die gebruikmaken van het geïmplementeerde servicecontract in de sectie serviceconfiguratie.
Opmerking
In het volgende codevoorbeeld ziet u het merendeel van een codebestand dat wordt gegenereerd door het hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) uit te voeren op metagegevensbestanden.
De volgende code toont:
De servicecontractinterface die, indien geïmplementeerd, voldoet aan de contractvereisten (
ISampleService
).De helperinterface voor clientgebruik die zowel de interface van het servicecontract uitbreidt als System.ServiceModel.IClientChannel voor gebruik in een clienttoepassing (
ISampleServiceChannel
).De helperklasse die wordt uitgebreid System.ServiceModel.ClientBase<TChannel> en is bedoeld voor gebruik in een clienttoepassing (
SampleServiceClient
).Het configuratiebestand dat is gegenereerd op basis van de service.
Een eenvoudige
ISampleService
service-implementatie.Een conversie van het configuratiebestand aan de clientzijde naar een versie aan de servicezijde.
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.42
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
[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;
}
}
}
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[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);
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}
[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);
}
}
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8080/SampleService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService" contract="ISampleService"
name="BasicHttpBinding_ISampleService" />
</client>
</system.serviceModel>
</configuration>
// Implement the service. This is a very simple service.
class SampleService : ISampleService
{
public string SampleMethod(string msg)
{
Console.WriteLine("The caller said: \"{0}\"", msg);
return "The service greets you: " + msg;
}
}
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService">
<endpoint address="http://localhost:8080/SampleService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService" contract="Microsoft.WCF.Documentation.ISampleService"
/>
</service>
</services>
</system.serviceModel>
</configuration>