Bindingen configureren voor Windows Communication Foundation Services
Bij het maken van een toepassing wilt u vaak beslissingen aan de beheerder uitstellen na de implementatie van de toepassing. Er is bijvoorbeeld vaak geen manier om vooraf te weten wat een serviceadres of URI (Uniform Resource Identifier) is. In plaats van een adres hard te coderen, is het beter om een beheerder dit te laten doen na het maken van een service. Deze flexibiliteit wordt bereikt via configuratie.
Notitie
Gebruik het hulpprogramma hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) met de /config
schakeloptie om snel configuratiebestanden te maken.
Hoofdsecties
Het WCF-configuratieschema (Windows Communication Foundation) bevat de volgende drie hoofdsecties (serviceModel
, bindings
en services
):
<configuration>
<system.serviceModel>
<bindings>
</bindings>
<services>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
ServiceModel-elementen
U kunt de sectie die is gebonden door het system.ServiceModel
element gebruiken om een servicetype te configureren met een of meer eindpunten, evenals instellingen voor een service. Elk eindpunt kan vervolgens worden geconfigureerd met een adres, een contract en een binding. Zie Overzicht van het maken van eindpunten voor meer informatie over eindpunten. Als er geen eindpunten zijn opgegeven, voegt de runtime standaardeindpunten toe. Zie Vereenvoudigde configuratie en vereenvoudigde configuratie voor WCF-services voor meer informatie over standaardeindpunten, bindingen en gedrag.
Een binding bevat transporten (HTTP, TCP, pipes, Message Queuing) en protocollen (Beveiliging, Betrouwbaarheid, Transactiestromen) en bestaat uit bindingselementen, die elk een aspect aangeven van de communicatie tussen een eindpunt en de wereld.
Als u bijvoorbeeld het <basicHttpBinding-element> opgeeft, wordt aangegeven dat HTTP moet worden gebruikt als het transport voor een eindpunt. Dit wordt gebruikt om het eindpunt tijdens runtime te verbinden wanneer de service die dit eindpunt gebruikt, wordt geopend.
Er zijn twee soorten bindingen: vooraf gedefinieerd en aangepast. Vooraf gedefinieerde bindingen bevatten nuttige combinaties van elementen die in algemene scenario's worden gebruikt. Zie Door het systeem verstrekte bindingen voor een lijst met vooraf gedefinieerde bindingstypen die WCF biedt. Als er geen vooraf gedefinieerde bindingverzameling de juiste combinatie heeft van functies die een servicetoepassing nodig heeft, kunt u aangepaste bindingen maken om te voldoen aan de vereisten van de toepassing. Zie customBinding voor meer informatie over aangepaste bindingen<.>
In de volgende vier voorbeelden ziet u de meest voorkomende bindingsconfiguraties die worden gebruikt voor het instellen van een WCF-service.
Een eindpunt opgeven voor het gebruik van een bindingstype
In het eerste voorbeeld ziet u hoe u een eindpunt opgeeft dat is geconfigureerd met een adres, een contract en een binding.
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<!-- This section is optional with the default configuration introduced
in .NET Framework 4. -->
<endpoint
address="/HelloWorld2/"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
In dit voorbeeld geeft het name
kenmerk aan voor welk servicetype de configuratie is bedoeld. Wanneer u een service maakt in uw code met het HelloWorld
contract, wordt deze geïnitialiseerd met alle eindpunten die zijn gedefinieerd in de voorbeeldconfiguratie. Als de assembly slechts één servicecontract implementeert, kan het name
kenmerk worden weggelaten omdat de service het enige beschikbare type gebruikt. Het kenmerk heeft een tekenreeks, die de indeling moet hebben Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Het address
kenmerk geeft de URI op die andere eindpunten gebruiken om te communiceren met de service. De URI kan een absoluut of relatief pad zijn. Als er een relatief adres wordt opgegeven, moet de host naar verwachting een basisadres opgeven dat geschikt is voor het transportschema dat in de binding wordt gebruikt. Als een adres niet is geconfigureerd, wordt ervan uitgegaan dat het basisadres het adres voor dat eindpunt is.
Het contract
kenmerk geeft het contract aan dat dit eindpunt beschikbaar is. Het type service-implementatie moet het contracttype implementeren. Als een service-implementatie één contracttype implementeert, kan deze eigenschap worden weggelaten.
Het binding
kenmerk selecteert een vooraf gedefinieerde of aangepaste binding die moet worden gebruikt voor dit specifieke eindpunt. Een eindpunt dat niet expliciet een binding selecteert, maakt gebruik van de standaardbindingsselectie.BasicHttpBinding
Een vooraf gedefinieerde binding wijzigen
In het volgende voorbeeld wordt een vooraf gedefinieerde binding gewijzigd. Deze kan vervolgens worden gebruikt om elk eindpunt in de service te configureren. De binding wordt gewijzigd door de ReceiveTimeout waarde in te stellen op 1 seconde. Houd er rekening mee dat de eigenschap een TimeSpan object retourneert.
Deze gewijzigde binding vindt u in de sectie Bindingen. Deze gewijzigde binding kan nu worden gebruikt bij het maken van een eindpunt door het binding
kenmerk in het element in te endpoint
stellen.
Notitie
Als u een bepaalde naam aan de binding geeft, moet het bindingConfiguration
opgegeven in het service-eindpunt overeenkomen met de binding.
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="/HelloWorld2/"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
<bindings>
<basicHttpBinding
receiveTimeout="00:00:01"
/>
</bindings>
Een gedrag configureren om toe te passen op een service
In het volgende voorbeeld wordt een specifiek gedrag geconfigureerd voor het servicetype. Het ServiceMetadataBehavior
element wordt gebruikt om het Hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) in te schakelen om een query uit te voeren op de service en WSDL-documenten (Web Services Description Language) te genereren op basis van de metagegevens.
Notitie
Als u een bepaalde naam aan het gedrag geeft, moet de behaviorConfiguration
opgegeven in de sectie service of eindpunt overeenkomen.
<behaviors>
<behavior>
<ServiceMetadata httpGetEnabled="true" />
</behavior>
</behaviors>
<services>
<service
name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="http://computer:8080/Hello"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
</services>
Met de voorgaande configuratie kan een client de metagegevens van de getypte 'HelloWorld'-service aanroepen en ophalen.
svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl
Een service met twee eindpunten opgeven met behulp van verschillende bindingswaarden
In dit laatste voorbeeld worden twee eindpunten geconfigureerd voor het HelloWorld
servicetype. Elk eindpunt maakt gebruik van een ander aangepast bindingConfiguration
kenmerk van hetzelfde bindingstype (elk wijzigt het basicHttpBinding
).
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="http://computer:8080/Hello1"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="shortTimeout" />
<endpoint
address="http://computer:8080/Hello2"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="Secure" />
</service>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure">
<Security mode="Transport" />
</basicHttpBinding>
</bindings>
U kunt hetzelfde gedrag krijgen met behulp van de standaardconfiguratie door een protocolMapping
sectie toe te voegen en de bindingen te configureren, zoals wordt weergegeven in het volgende voorbeeld.
<protocolMapping>
<add scheme="http" binding="basicHttpBinding" bindingConfiguration="shortTimeout" />
<add scheme="https" binding="basicHttpBinding" bindingConfiguration="Secure" />
</protocolMapping>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure" />
<Security mode="Transport" />
</bindings>