Services configureren met behulp van configuratiebestanden
Het configureren van een WCF-service (Windows Communication Foundation) met een configuratiebestand biedt u de flexibiliteit om eindpunt- en servicegedragsgegevens op te geven op het moment van implementatie in plaats van op het ontwerp. In dit onderwerp worden de belangrijkste technieken beschreven die beschikbaar zijn.
Een WCF-service kan worden geconfigureerd met behulp van de .NET Framework-configuratietechnologie. Meestal worden XML-elementen toegevoegd aan het Web.config-bestand voor een IIS-site (Internet Information Services) die als host fungeert voor een WCF-service. Met de elementen kunt u details wijzigen, zoals de eindpuntadressen (de werkelijke adressen die worden gebruikt om met de service te communiceren) per machine. Daarnaast bevat WCF verschillende door het systeem geleverde elementen waarmee u snel de meest elementaire functies voor een service kunt selecteren. Vanaf .NET Framework 4 wordt WCF geleverd met een nieuw standaardconfiguratiemodel dat de WCF-configuratievereisten vereenvoudigt. Als u geen WCF-configuratie voor een bepaalde service opgeeft, configureert de runtime automatisch uw service met enkele standaardeindpunten en standaardbinding/gedrag. In de praktijk is het schrijven van configuratie een belangrijk onderdeel van het programmeren van WCF-toepassingen.
Zie Bindingen configureren voor services voor meer informatie. Zie Door het systeem geleverde bindingen voor een lijst met de meest gebruikte elementen. Zie Vereenvoudigde configuratie en vereenvoudigde configuratie voor WCF-services voor meer informatie over standaardeindpunten, bindingen en gedrag.
Belangrijk
Bij het implementeren van scenario's naast elkaar waarbij twee verschillende versies van een service worden geïmplementeerd, moet u gedeeltelijke namen opgeven van assembly's waarnaar wordt verwezen in configuratiebestanden. Dit komt doordat het configuratiebestand wordt gedeeld in alle versies van een service en ze kunnen worden uitgevoerd onder verschillende versies van .NET Framework.
System.Configuration: Web.config en App.config
WCF maakt gebruik van het System.Configuration-configuratiesysteem van .NET Framework.
Wanneer u een service configureert in Visual Studio, gebruikt u een Web.config-bestand of een App.config-bestand om de instellingen op te geven. De keuze van de naam van het configuratiebestand wordt bepaald door de hostingomgeving die u voor de service kiest. Als u IIS gebruikt om uw service te hosten, gebruikt u een Web.config-bestand. Als u een andere hostingomgeving gebruikt, gebruikt u een App.config-bestand.
In Visual Studio wordt het bestand met de naam App.config gebruikt om het uiteindelijke configuratiebestand te maken. De uiteindelijke naam die daadwerkelijk voor de configuratie wordt gebruikt, is afhankelijk van de assemblynaam. Een assembly met de naam 'Cohowinery.exe' heeft bijvoorbeeld de uiteindelijke configuratiebestandsnaam 'Cohowinery.exe.config'. U hoeft het bestand App.config echter alleen te wijzigen. Wijzigingen in dat bestand worden automatisch aangebracht in het uiteindelijke configuratiebestand van de toepassing tijdens het compileren.
Als u een App.config gebruikt, voegt het configuratiesysteem het App.config-bestand samen met de inhoud van het bestand Machine.config wanneer de toepassing wordt gestart en de configuratie wordt toegepast. Met dit mechanisme kunnen instellingen voor de hele machine worden gedefinieerd in het bestand Machine.config. Het Bestand App.config kan worden gebruikt om de instellingen van het bestand Machine.config te overschrijven; u kunt de instellingen in het bestand Machine.config ook vergrendelen, zodat ze worden gebruikt. In het geval Web.config voegt het configuratiesysteem de Web.config-bestanden samen in alle mappen die leiden tot de toepassingsmap in de configuratie die wordt toegepast. Zie onderwerpen in de System.Configuration naamruimte voor meer informatie over configuratie en de prioriteiten voor instellingen.
Hoofdsecties van het configuratiebestand
De belangrijkste secties in het configuratiebestand bevatten de volgende elementen.
<system.ServiceModel>
<services>
<!-- Define the service endpoints. This section is optional in the new
default configuration model in .NET Framework 4. -->
<service>
<endpoint/>
</service>
</services>
<bindings>
<!-- Specify one or more of the system-provided binding elements,
for example, <basicHttpBinding> -->
<!-- Alternatively, <customBinding> elements. -->
<binding>
<!-- For example, a <BasicHttpBinding> element. -->
</binding>
</bindings>
<behaviors>
<!-- One or more of the system-provided or custom behavior elements. -->
<behavior>
<!-- For example, a <throttling> element. -->
</behavior>
</behaviors>
</system.ServiceModel>
Notitie
De secties bindingen en gedragingen zijn optioneel en worden alleen opgenomen indien nodig.
Het <services-element>
Het services
element bevat de specificaties voor alle services die door de toepassingshosts worden gehost. Vanaf het vereenvoudigde configuratiemodel in .NET Framework 4 is deze sectie optioneel.
Het <service-element>
Elke service heeft deze kenmerken:
name
. Hiermee geeft u het type op dat een implementatie van een servicecontract biedt. Dit is een volledig gekwalificeerde naam die bestaat uit de naamruimte, een punt en vervolgens de typenaam. Bijvoorbeeld"MyNameSpace.myServiceType"
.behaviorConfiguration
. Hiermee geeft u de naam van een van debehavior
elementen in hetbehaviors
element. Het opgegeven gedrag bepaalt acties zoals of de service imitatie toestaat. Als de waarde de lege naam of neebehaviorConfiguration
is, wordt de standaardset servicegedrag toegevoegd aan de service.
Het <eindpuntelement>
Elk eindpunt vereist een adres, een binding en een contract, die worden vertegenwoordigd door de volgende kenmerken:
address
. Hiermee geeft u de URI (Uniform Resource Identifier) van de service op. Dit kan een absoluut adres zijn of een adres dat wordt opgegeven ten opzichte van het basisadres van de service. Als dit is ingesteld op een lege tekenreeks, geeft dit aan dat het eindpunt beschikbaar is op het basisadres dat is opgegeven bij het maken van de ServiceHost service.binding
. Geeft doorgaans een door het systeem geleverde binding op, zoals WSHttpBinding, maar kan ook een door de gebruiker gedefinieerde binding opgeven. De opgegeven binding bepaalt het type transport, beveiliging en codering dat wordt gebruikt en of betrouwbare sessies, transacties of streaming wordt ondersteund of ingeschakeld.bindingConfiguration
. Als de standaardwaarden van een binding moeten worden gewijzigd, kan dit worden gedaan door het juistebinding
element in hetbindings
element te configureren. Dit kenmerk moet dezelfde waarde krijgen als hetname
kenmerk van hetbinding
element dat wordt gebruikt om de standaardwaarden te wijzigen. Als er geen naam wordt opgegeven of als er geenbindingConfiguration
naam is opgegeven in de binding, wordt de standaardbinding van het bindingstype gebruikt in het eindpunt.contract
. Hiermee geeft u de interface die het contract definieert. Dit is de interface die is geïmplementeerd in het CLR-type (Common Language Runtime) dat is opgegeven door hetname
kenmerk van hetservice
element.
Het <bindingselement>
Het bindings
element bevat de specificaties voor alle bindingen die kunnen worden gebruikt door elk eindpunt dat in elke service is gedefinieerd.
Het <bindingselement>
De binding
elementen in het element kunnen een van de door het systeem geleverde bindingen zijn (zie Door het bindings
systeem geleverde bindingen) of een aangepaste binding (zie Aangepaste bindingen). Het binding
element heeft een name
kenmerk dat de binding correleert met het eindpunt dat is opgegeven in het bindingConfiguration
kenmerk van het endpoint
element. Als er geen naam is opgegeven, komt die binding overeen met de standaardwaarde van dat bindingstype.
Zie WCF-services configureren voor meer informatie over het configureren van services en clients.
Het <gedragselement>
Dit is een containerelement voor de behavior
elementen die het gedrag voor een service definiëren.
Het <gedragselement>
Elk behavior
element wordt geïdentificeerd door een name
kenmerk en biedt een door het systeem geleverd gedrag, zoals <throttling>
, of een aangepast gedrag. Als er geen naam wordt gegeven, komt dat gedragselement overeen met het standaardgedrag van de service of het eindpunt.
Bindings- en gedragsconfiguraties gebruiken
MET WCF kunt u eenvoudig configuraties tussen eindpunten delen met behulp van een referentiesysteem in de configuratie. In plaats van configuratiewaarden rechtstreeks toe te wijzen aan een eindpunt, worden bindingsgerelateerde configuratiewaarden gegroepeerd in bindingConfiguration
elementen in de <binding>
sectie. Een bindingsconfiguratie is een benoemde groep instellingen voor een binding. Eindpunten kunnen vervolgens verwijzen naar de bindingConfiguration
op naam.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="myBindingConfiguration1" closeTimeout="00:01:00" />
<binding name="myBindingConfiguration2" closeTimeout="00:02:00" />
<binding closeTimeout="00:03:00" /> <!-- Default binding for basicHttpBinding -->
</basicHttpBinding>
</bindings>
<services>
<service name="MyNamespace.myServiceType">
<endpoint
address="myAddress" binding="basicHttpBinding"
bindingConfiguration="myBindingConfiguration1"
contract="MyContract" />
<endpoint
address="myAddress2" binding="basicHttpBinding"
bindingConfiguration="myBindingConfiguration2"
contract="MyContract" />
<endpoint
address="myAddress3" binding="basicHttpBinding"
contract="MyContract" />
</service>
</services>
</system.serviceModel>
</configuration>
De name
is bindingConfiguration
ingesteld in het <binding>
element. Het name
moet een unieke tekenreeks binnen het bereik van het bindingstype zijn, in dit geval de <basicHttpBinding> of een lege waarde die naar de standaardbinding verwijst. Het eindpunt is gekoppeld aan de configuratie door het bindingConfiguration
kenmerk in te stellen op deze tekenreeks.
Een behaviorConfiguration
wordt op dezelfde manier geïmplementeerd, zoals geïllustreerd in het volgende voorbeeld.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="myBehavior">
<callbackDebug includeExceptionDetailInFaults="true" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="NewServiceType">
<endpoint
address="myAddress3" behaviorConfiguration="myBehavior"
binding="basicHttpBinding"
contract="MyContract" />
</service>
</services>
</system.serviceModel>
</configuration>
Houd er rekening mee dat de standaardset servicegedrag wordt toegevoegd aan de service. Met dit systeem kunnen eindpunten algemene configuraties delen zonder de instellingen opnieuw te definiëren. Als het bereik voor de hele machine vereist is, maakt u de bindings- of gedragsconfiguratie in Machine.config. De configuratie-instellingen zijn beschikbaar in alle App.config-bestanden. Met het hulpprogramma configuratie-editor (SvcConfigEditor.exe) kunt u eenvoudig configuraties maken.
Gedrag samenvoegen
De functie voor het samenvoegen van gedrag maakt het eenvoudiger om gedrag te beheren wanneer u wilt dat een reeks veelvoorkomende gedragingen consistent wordt gebruikt. Met deze functie kunt u gedrag opgeven op verschillende niveaus van de configuratiehiërarchie en services gedrag overnemen van meerdere niveaus van de configuratiehiërarchie. Als u wilt laten zien hoe dit werkt, wordt ervan uitgegaan dat u de volgende indeling voor virtuele mappen in IIS hebt:
~\Web.config~\Service.svc~\Child\Web.config~\Child\Service.svc
En uw ~\Web.config
bestand heeft de volgende inhoud:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
En u hebt een onderliggende Web.config op ~\Child\Web.config met de volgende inhoud:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
De service op ~\Child\Service.svc gedraagt zich alsof deze zowel het gedrag serviceDebug als serviceMetadata heeft. De service op ~\Service.svc heeft alleen het gedrag van serviceDebug. Wat er gebeurt, is dat de twee gedragsverzamelingen met dezelfde naam (in dit geval de lege tekenreeks) worden samengevoegd.
U kunt gedragverzamelingen ook wissen met behulp van de <duidelijke> tag en afzonderlijke gedragingen uit de verzameling verwijderen met behulp van de <tag verwijderen> . De volgende twee configuraties leiden er bijvoorbeeld toe dat de onderliggende service alleen het gedrag serviceMetadata heeft:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<remove name="serviceDebug"/>
<serviceMetadata httpGetEnabled="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<clear/>
<serviceMetadata httpGetEnabled="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Gedragssamenvoeging wordt uitgevoerd voor naamloze gedragsverzamelingen zoals hierboven en benoemde gedragsverzamelingen.
Gedrag samenvoegen werkt in de IIS-hostingomgeving, waarin Web.config-bestanden hiërarchisch worden samengevoegd met het hoofdbestand Web.config en machine.config. Maar het werkt ook in de toepassingsomgeving, waarbij machine.config kan worden samengevoegd met het Bestand App.config.
Het samenvoegen van gedrag is van toepassing op zowel eindpuntgedrag als servicegedrag in de configuratie.
Als een verzameling onderliggend gedrag een gedrag bevat dat al aanwezig is in de verzameling bovenliggend gedrag, overschrijft het onderliggende gedrag het bovenliggende gedrag. Dus als een verzameling bovenliggend gedrag had <serviceMetadata httpGetEnabled="False" />
en een onderliggende gedragsverzameling had <serviceMetadata httpGetEnabled="True" />
, zou het onderliggende gedrag het bovenliggende gedrag in de gedragsverzameling overschrijven en httpGetEnabled 'true' zijn.