Konfigurace vazeb pro služby Windows Communication Foundation
Při vytváření aplikace často chcete odložit rozhodnutí správci po nasazení aplikace. Například často neexistuje způsob, jak předem zjistit, jaká adresa služby nebo identifikátor URI (Uniform Resource Identifier) bude. Místo pevně zakódované adresy je vhodnější povolit správci, aby to udělal po vytvoření služby. Tato flexibilita se provádí prostřednictvím konfigurace.
Poznámka:
Pomocí nástroje ServiceModel Metadata Utility (Svcutil.exe) s /config
přepínačem můžete rychle vytvářet konfigurační soubory.
Hlavní oddíly
Schéma konfigurace wcf (Windows Communication Foundation) obsahuje následující tři hlavní části (serviceModel
, bindings
a services
):
<configuration>
<system.serviceModel>
<bindings>
</bindings>
<services>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
Elementy modelu služby
Oddíl ohraničený elementem system.ServiceModel
můžete použít ke konfiguraci typu služby s jedním nebo více koncovými body a také nastavení pro službu. Každý koncový bod je pak možné nakonfigurovat s adresou, kontraktem a vazbou. Další informace o koncových bodech najdete v tématu Přehled vytváření koncových bodů. Pokud nejsou zadány žádné koncové body, modul runtime přidá výchozí koncové body. Další informace o výchozích koncových bodech, vazbách a chování najdete v tématu Zjednodušená konfigurace a zjednodušená konfigurace pro služby WCF.
Vazba určuje přenosy (HTTP, TCP, kanály, řízení front zpráv) a protokoly (zabezpečení, spolehlivost, toky transakcí) a skládá se z prvků vazby, z nichž každý určuje aspekt komunikace koncového bodu se světem.
Například zadání elementu <basicHttpBinding> označuje použití protokolu HTTP jako přenosu koncového bodu. Používá se k připojení koncového bodu za běhu při otevření služby pomocí tohoto koncového bodu.
Existují dva druhy vazeb: předdefinované a vlastní. Předdefinované vazby obsahují užitečné kombinace prvků, které se používají v běžných scénářích. Seznam předdefinovaných typů vazeb, které WCF poskytuje, naleznete v tématu Systémové vazby. Pokud žádná předdefinovaná kolekce vazeb nemá správnou kombinaci funkcí, které aplikace služby potřebuje, můžete vytvořit vlastní vazby tak, aby splňovaly požadavky aplikace. Další informace o vlastních vazbách najdete v tématu <customBinding>.
Následující čtyři příklady ilustrují nejběžnější konfigurace vazeb používané k nastavení služby WCF.
Zadání koncového bodu pro použití typu vazby
První příklad ukazuje, jak zadat koncový bod nakonfigurovaný s adresou, kontraktem a vazbou.
<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>
V tomto příkladu name
atribut označuje, pro který typ služby je konfigurace určena. Když ve svém kódu vytvoříte službu s kontraktem HelloWorld
, inicializuje se se všemi koncovými body definovanými v ukázkové konfiguraci. Pokud sestavení implementuje pouze jeden kontrakt služby, může být atribut vynechán, name
protože služba používá jediný dostupný typ. Atribut přebírá řetězec, který musí být ve formátu. Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Atribut address
určuje identifikátor URI, který ostatní koncové body používají ke komunikaci se službou. Identifikátor URI může být absolutní nebo relativní cesta. Pokud je k dispozici relativní adresa, očekává se, že hostitel poskytne základní adresu, která je vhodná pro schéma přenosu použitého v vazbě. Pokud adresa není nakonfigurovaná, předpokládá se, že základní adresa je adresa daného koncového bodu.
Atribut contract
určuje kontrakt, který tento koncový bod vystavuje. Typ implementace služby musí implementovat typ kontraktu. Pokud implementace služby implementuje jeden typ kontraktu, může být tato vlastnost vynechána.
Atribut binding
vybere předdefinovanou nebo vlastní vazbu, která se má použít pro tento konkrétní koncový bod. Koncový bod, který explicitně nevybere vazbu, používá výchozí výběr vazby, což je BasicHttpBinding
.
Úprava předdefinované vazby
V následujícím příkladu je předdefinovaná vazba změněna. Pak se dá použít ke konfiguraci libovolného koncového bodu ve službě. Vazba se upraví nastavením hodnoty na 1 sekundu ReceiveTimeout . Všimněte si, že vlastnost vrací TimeSpan objekt.
Tato změněná vazba se nachází v části vazby. Tuto změněnou vazbu lze nyní použít při vytváření libovolného koncového bodu nastavením binding
atributu v elementu endpoint
.
Poznámka:
Pokud vazbu bindingConfiguration
pojmenujete, musí se zadaný v koncovém bodu služby shodovat.
<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>
Konfigurace chování pro použití u služby
V následujícím příkladu je pro typ služby nakonfigurované konkrétní chování. Tento ServiceMetadataBehavior
element slouží k povolení nástroje ServiceModel Metadata Utility Tool (Svcutil.exe) dotazování služby a generování dokumentů WSDL (Web Services Description Language) z metadat.
Poznámka:
Pokud dáte konkrétnímu názvu chování, behaviorConfiguration
musí se shodovat zadaný v části služby nebo koncového bodu.
<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>
Předchozí konfigurace umožňuje klientovi volat a získat metadata služby typu HelloWorld.
svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl
Určení služby se dvěma koncovými body pomocí různých hodnot vazeb
V tomto posledním příkladu jsou pro HelloWorld
typ služby nakonfigurované dva koncové body. Každý koncový bod používá jiný přizpůsobený bindingConfiguration
atribut stejného typu vazby (každý upraví 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>
Stejné chování můžete získat pomocí výchozí konfigurace tak, že přidáte protocolMapping
oddíl a nakonfigurujete vazby, jak je znázorněno v následujícím příkladu.
<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>