Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Chování umožňují upravit výchozí chování a přidat vlastní rozšíření, která kontrolují a ověřují konfiguraci služby nebo upravují chování v době běhu v klientských aplikacích a aplikacích služeb WCF (Windows Communication Foundation). Toto téma popisuje rozhraní chování, jak je implementovat a jak je přidat do popisu služby (v aplikaci služby) nebo koncového bodu (v klientské aplikaci) programově nebo v konfiguračním souboru. Další informace o používání chování poskytovaného systémem naleznete v tématu Určení chování služby Run-Time a určení chování klienta Run-Time.
Chování
Typy chování se přidají do objektů popisu služby nebo koncového bodu služby (na službě nebo klientovi, podle potřeby), předtím než Windows Communication Foundation (WCF) tyto objekty použije k vytvoření modulu runtime, který vykonává službu WCF nebo klienta WCF. Pokud jsou tato chování volána během procesu vytváření runtime, pak mají možnost získat přístup k vlastnostem a metodám runtime, které upravují runtime vytvořený kontraktem, vazbami a adresami.
Metody chování
Všechna chování mají metodu AddBindingParameters , metodu ApplyDispatchBehavior , metodu Validate a metodu ApplyClientBehavior s jednou výjimkou: Protože IServiceBehavior nelze provést v klientovi, neimplementuje ApplyClientBehavior.
Pomocí metody
AddBindingParametersmůžete upravit nebo přidat vlastní objekty do kolekce, ke které mohou mít vlastní vazby přístup pro své použití při sestavování modulu runtime. Tímto způsobem jsou například specifikovány požadavky na ochranu, které ovlivňují způsob vytváření kanálu, ale nejsou známé vývojářem kanálu.Použijte metodu
Validatek prozkoumání stromu popisu a odpovídajícího objektu modulu runtime, abyste zajistili, že odpovídá určité sadě kritérií.Pomocí metod
ApplyDispatchBehavioraApplyClientBehaviorprozkoumejte strom popisu a upravte prostředí runtime pro konkrétní obor buď na straně služby, nebo na straně klienta. Můžete také vložit rozšiřující objekty.Poznámka:
I když je v těchto metodách k dispozici strom popisu, je určen pouze ke zkoumání. Pokud je změněn strom popisu, chování není definováno.
Vlastnosti, které můžete upravit, a rozhraní pro přizpůsobení, která můžete implementovat, jsou přístupné prostřednictvím runtime tříd pro službu a klienta. Typy služeb jsou třídy DispatchRuntime a DispatchOperation třídy. Typy klientů jsou třídy ClientRuntime a ClientOperation třídy. ClientRuntime a DispatchRuntime třídy jsou výchozími body pro rozšiřitelnost, které umožňují přístup k vlastnostem runtime celého klienta a ke kolekcím rozšíření pro celou službu. Podobně třídy ClientOperation a DispatchOperation zpřístupňují vlastnosti modulu runtime klientských operací a operací služby, stejně jako kolekce rozšíření. V případě potřeby však můžete přistupovat k širšímu objektu běhového prostředí z běhového objektu operace a naopak.
Poznámka:
Diskuzi o vlastnostech modulu runtime a typech rozšíření, které můžete použít k úpravě chování spuštění klienta, naleznete v tématu Rozšíření klientů. Diskuzi o vlastnostech modulu runtime a typech rozšíření, které můžete použít k úpravě chování provádění dispečer služby, naleznete v tématu Rozšíření dispečerů.
Většina uživatelů WCF přímo nepracuje s modulem runtime; místo toho používají základní programovací modely, jako jsou koncové body, kontrakty, vazby, adresy a atributy chování u tříd nebo chování v konfiguračních souborech. Tyto konstrukce tvoří strom popisu, což je úplná specifikace pro vytvoření modulu runtime pro podporu služby nebo klienta popsaného stromem popisu.
Wcf má čtyři druhy chování:
Chování služby (IServiceBehavior typy) umožňují přizpůsobení celého běhového prostředí služby, včetně ServiceHostBase.
Chování koncových bodů (typy IEndpointBehavior) umožňuje přizpůsobení služebních koncových bodů a jejich přidružených objektů EndpointDispatcher.
Chování kontraktů (IContractBehavior typů) umožňuje přizpůsobení jak tříd ClientRuntime, tak i tříd DispatchRuntime v klientských a servisních aplikacích.
Chování operací (IOperationBehavior typy) umožňují přizpůsobení tříd ClientOperation a DispatchOperation na straně klienta i služby.
Toto chování můžete přidat do různých objektů popisu implementací vlastních atributů, pomocí konfiguračních souborů aplikace nebo přímo jejich přidáním do kolekce chování v příslušném objektu popisu. Objekt popisu služby nebo koncového bodu služby však musí být přidán do popisu služby nebo koncového bodu služby před voláním ICommunicationObject.Open na objekt ServiceHost nebo ChannelFactory<TChannel>.
Rozsahy chování
Existují čtyři typy chování, z nichž každá odpovídá určitému rozsahu přístupu za běhu.
Chování poskytované služby
Chování služby, která implementují IServiceBehavior, jsou primárním mechanismem, kterým upravujete celé běhové prostředí služby. Existují tři mechanismy pro přidání chování služby.
Použití atributu ve třídě služby. ServiceHost Při vytváření ServiceHost implementace používá reflexi ke zjištění sady atributů typu služby. Pokud některé z těchto atributů jsou implementace IServiceBehavior, jsou přidány do kolekce chování v ServiceDescription. To umožňuje, aby se tato chování účastnila výstavby běhového prostředí služby.
Programatické přidání chování do kolekce chování na ServiceDescription. Toho lze dosáhnout pomocí následujících řádků kódu:
ServiceHost host = new ServiceHost(/* Parameters */); host.Description.Behaviors.Add(/* Service Behavior */);Implementace vlastního BehaviorExtensionElement , které rozšiřuje konfiguraci. To umožňuje použití chování služby z konfiguračních souborů aplikace.
Mezi příklady chování služby ve WCF patří ServiceBehaviorAttribute atribut, ServiceThrottlingBehavior a ServiceMetadataBehavior chování.
Chování kontraktů
Chování kontraktů, které implementují rozhraní IContractBehavior, se používají k rozšíření modulu runtime klienta i služby v rámci kontraktu.
Existují dva mechanismy pro přidání chování kontraktu do kontraktu. Prvním mechanismem je vytvoření vlastního atributu, který se použije v rozhraní kontraktu. Když je rozhraní kontraktu předáno buď do ServiceHost nebo do ChannelFactory<TChannel>, WCF prozkoumá atributy na rozhraní. Pokud jsou některé atributy implementacemi IContractBehavior, přidávají se do kolekce chování na System.ServiceModel.Description.ContractDescription, která je vytvořena pro toto rozhraní.
Můžete také implementovat atribut chování vlastního kontraktu System.ServiceModel.Description.IContractBehaviorAttribute. V tomto případě je chování při použití na:
•Rozhraní smlouvy. V tomto případě se chování použije u všech kontraktů tohoto typu v libovolném koncovém bodu a WCF ignoruje hodnotu IContractBehaviorAttribute.TargetContract vlastnosti.
•Třída služby. V tomto případě se chování použije pouze na koncové body, jejichž smlouvou je hodnota vlastnosti TargetContract.
•Třída zpětného volání. V tomto případě se chování použije na koncový bod duplexního klienta a WCF ignoruje hodnotu TargetContract vlastnosti.
Druhým mechanismem je přidat chování do kolekce chování v objektu ContractDescription.
Příklady chování kontraktů ve WCF zahrnují System.ServiceModel.DeliveryRequirementsAttribute atribut. Další informace a příklad najdete v referenčním tématu.
Chování koncových bodů
Chování koncových bodů, které implementují IEndpointBehavior, je hlavním mechanismem, kterým upravíte celou službu nebo běhové prostředí klienta pro konkrétní koncový bod.
Existují dva mechanismy pro přidání chování koncových bodů do služby.
Přidejte chování do Behaviors vlastnosti.
Implementujte vlastní BehaviorExtensionElement, která rozšiřuje konfiguraci.
Další informace a příklad najdete v referenčním tématu.
Chování operací
Chování operací, která implementují IOperationBehavior rozhraní, se používají pro rozšíření runtime klienta i služby pro každou operaci.
Existují dva mechanismy pro přidání operačních chování k operacím. Prvním mechanismem je vytvoření vlastního atributu, který se použije u metody, která operaci modeluje. Při přidání operace do ServiceHost nebo ChannelFactory WCF přidá veškeré atributy IOperationBehavior do kolekce chování na OperationDescription, která byla vytvořena pro danou operaci.
Druhým mechanismem je přímé přidání chování do kolekce chování v vytvořeném OperationDescriptionobjektu .
Příklady chování operací ve WCF zahrnují jednu a druhou OperationBehaviorAttribute a TransactionFlowAttribute.
Další informace a příklad najdete v referenčním tématu.
Použití konfigurace k vytváření chování
Chování služby a koncového bodu a kontraktů může být určeno v kódu nebo pomocí atributů; Pomocí konfiguračních souborů aplikace nebo webu je možné nakonfigurovat pouze chování služby a koncového bodu. Zveřejnění chování pomocí atributů umožňuje vývojářům určit chování v době kompilace, které nelze přidat, odebrat nebo upravit za běhu. To je často vhodné pro chování, které jsou vždy vyžadovány pro správnou operaci služby (například parametry související s transakcemi atributu System.ServiceModel.ServiceBehaviorAttribute ). Zveřejnění chování pomocí konfigurace umožňuje vývojářům ponechat specifikaci a konfiguraci těchto chování těm, kteří službu nasazují. To je vhodné pro chování, která jsou volitelné komponenty nebo jiná konfigurace specifická pro nasazení, jako je například to, jestli jsou pro službu zpřístupněna metadata nebo konkrétní konfigurace autorizace pro službu.
Poznámka:
Můžete také použít chování podporující konfiguraci k vynucení zásad podnikových aplikací tak, že je vložíte do konfiguračního souboru machine.config a uzamknete tyto položky. Popis a příklad najdete v tématu Postupy: Uzamčení koncových bodů v podniku.
Aby vývojář mohl zveřejnit chování pomocí konfigurace, musí vytvořit odvozenou třídu z BehaviorExtensionElement a pak toto rozšíření zaregistrovat v konfiguraci.
Následující příklad kódu ukazuje, jak IEndpointBehavior implementuje BehaviorExtensionElement:
// BehaviorExtensionElement members
public override Type BehaviorType
{
get { return typeof(EndpointBehaviorMessageInspector); }
}
protected override object CreateBehavior()
{
return new EndpointBehaviorMessageInspector();
}
Aby konfigurační systém načetl vlastní BehaviorExtensionElement, je nutné, aby bylo registrováno jako rozšíření. Následující příklad kódu ukazuje konfigurační soubor pro předchozí chování koncového bodu:
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="metadataSupport"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/ServiceMetadata" />
</baseAddresses>
</host>
<endpoint
address="/SampleService"
binding="wsHttpBinding"
behaviorConfiguration="withMessageInspector"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="withMessageInspector">
<endpointMessageInspector />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add
name="endpointMessageInspector"
type="Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
/>
</behaviorExtensions>
</extensions>
</system.serviceModel>
</configuration>
Kde Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector je typ rozšíření chování a HostApplication je název sestavení, do kterého byla tato třída zkompilována.
Pořadí vyhodnocení
System.ServiceModel.ChannelFactory<TChannel> a System.ServiceModel.ServiceHost jsou zodpovědné za sestavení běhového prostředí z popisu a programovacího modelu. Chování, jak jsme už popsali dříve, přispívají k danému procesu sestavení ve službě, koncovém bodu, kontraktu a operaci.
Použití ServiceHost se řídí následujícím pořadím chování:
Služba
Smlouva
Koncový bod
Operace
V rámci jakékoli kolekce chování není zaručeno žádné pořadí.
Použití ChannelFactory<TChannel> se řídí následujícím pořadím chování:
Smlouva
Koncový bod
Operace
V jakékoli kolekci chování opět není zaručeno žádné pořadí.
Programové přidávání chování
Vlastnosti System.ServiceModel.Description.ServiceDescription v aplikaci služby nesmí být změněny poté, co byla použita metoda CommunicationObject.OnOpening na System.ServiceModel.ServiceHostBase. Někteří členové, jako je ServiceHostBase.Credentials vlastnost a AddServiceEndpoint metody na ServiceHostBase a System.ServiceModel.ServiceHost, vyvolají výjimku, pokud byly změněny po tomto bodu. Ostatní vám umožňují je upravovat, ale výsledek je nedefinovaný.
Podobně na straně klienta nesmí být System.ServiceModel.Description.ServiceEndpoint hodnoty změněny po volání OnOpening na System.ServiceModel.ChannelFactory straně. Vlastnost ChannelFactory.Credentials vyvolá výjimku, pokud byla změněna po tomto bodu, ale ostatní hodnoty popisu klienta lze upravit bez chyby. Výsledek je však nedefinovaný.
Bez ohledu na to, zda jde o službu či klienta, doporučujeme upravit popis před voláním CommunicationObject.Open.
Pravidla dědičnosti atributů chování
Všechny čtyři typy chování lze naplnit pomocí atributů – chování služeb a chování kontraktů. Vzhledem k tomu, že atributy jsou definovány u spravovaných objektů a členů a spravovaných objektů a členů podporují dědičnost, je nutné definovat, jak atributy chování fungují v kontextu dědičnosti.
Na vysoké úrovni je pravidlo, že pro konkrétní obor (například služba, kontrakt nebo operace) se použijí všechny atributy chování v hierarchii dědičnosti pro daný obor. Pokud existují dva atributy chování stejného typu, použije se pouze nejvíce odvozený typ.
Chování poskytované služby
U dané třídy služby se použijí všechny atributy chování služby, které se vztahují na tuto třídu a její nadřazené třídy. Pokud je stejný typ atributu použit na více místech v hierarchii dědičnosti, použije se nejvíce odvozený typ.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
[AspNetCompatibilityRequirementsAttribute(
AspNetCompatibilityRequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class A { /* … */ }
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class B : A { /* … */}
Například v předchozím případě služba B končí s InstanceContextModeSingle, režimem AspNetCompatibilityRequirementsModeAllowed, a s ConcurrencyModeSingle. ConcurrencyMode je Single, protože atribut ServiceBehaviorAttribute ve službě B je "odvozenější" než ve službě A.
Chování kontraktů
Pro daný kontrakt se použijí všechny atributy chování kontraktů na daném rozhraní a jeho nadřazených rozhraních. Pokud je stejný typ atributu použit na více místech v hierarchii dědičnosti, použije se nejvíce odvozený typ.
Chování operací
Pokud daná operace nepřepíše existující abstraktní nebo virtuální operaci, nebudou platit žádná pravidla dědičnosti.
Pokud operace přepíše existující operaci, použijí se všechny atributy chování operace na tuto operaci a na její nadřazené operace. Pokud je stejný typ atributu použit na více místech v hierarchii dědičnosti, použije se nejvíce odvozený typ.