Konfigurace a rozšíření modulu runtime s chováním

Chování umožňuje upravit výchozí chování a přidat vlastní rozšíření, která kontrolují a ověřují konfiguraci služby nebo upravují chování modulu runtime 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í systémových chování naleznete v tématu Určení chování za běhu služby a určení chování klienta za běhu.

Chování

Typy chování se přidají do objektů popisů služby nebo koncového bodu služby (v tomto pořadí) před těmito objekty, které služba Windows Communication Foundation (WCF) používá k vytvoření modulu runtime, který spouští službu WCF nebo klienta WCF. Pokud jsou tato chování volána během procesu vytváření modulu runtime, jsou pak schopny získat přístup k vlastnostem a metodám modulu runtime, které upravují modul 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.

  • AddBindingParameters Pomocí metody můžete upravit nebo přidat vlastní objekty do kolekce, ke které mají vlastní vazby přístup při vytváření 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 Validate k prozkoumání stromu popisu a odpovídajícího objektu modulu runtime, abyste zajistili, že odpovídá určité sadě kritérií.

  • ApplyDispatchBehavior Pomocí a ApplyClientBehavior metod prozkoumejte strom popisu a upravte modul runtime pro konkrétní obor služby nebo 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 tříd modulu runtime služby a klienta. Typy služeb jsou třídy DispatchRuntime a DispatchOperation třídy. Typy klientů jsou třídy ClientRuntime a ClientOperation třídy. DispatchRuntime Třídy ClientRuntime jsou vstupními body rozšiřitelnosti pro přístup k vlastnostem modulu runtime celého klienta a kolekcí rozšíření pro celou službu. ClientOperation Podobně třídy DispatchOperation zpřístupňují klientské operace a vlastnosti modulu runtime operace služby a kolekce rozšíření. V případě potřeby však můžete přistupovat k širšímu objektu modulu runtime s vymezeným oborem z objektu runtime 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í:

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. Před voláním ICommunicationObject.Open na objekt popisu služby nebo koncového bodu služby však musí být přidán do objektu ServiceHost popisu služby nebo koncového ChannelFactory<TChannel>bodu služby .

Obory 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í služby

Chování služby, které implementují IServiceBehavior, jsou primárním mechanismem, kterým upravíte celý modul runtime služby. Existují tři mechanismy pro přidání chování služby do služby.

  1. 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 doby běhu služby.

  2. Programové přidání chování do kolekce chování v ServiceDescriptionsouboru . Toho lze dosáhnout pomocí následujících řádků kódu:

    ServiceHost host = new ServiceHost(/* Parameters */);  
    host.Description.Behaviors.Add(/* Service Behavior */);  
    
  3. Implementace vlastního BehaviorExtensionElement rozšíření konfigurace 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, a ServiceThrottlingBehaviorServiceMetadataBehavior chování.

Chování kontraktů

Chování kontraktů, které implementují IContractBehavior rozhraní, se používají k rozšíření modulu runtime klienta i služby napříč kontraktem.

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 nebo ServiceHostChannelFactory<TChannel>do , WCF prozkoumá atributy v rozhraní. Pokud jsou některé atributy implementace IContractBehavior, jsou přidány do kolekce chování vytvořené System.ServiceModel.Description.ContractDescription pro toto rozhraní.

Můžete také implementovat atribut System.ServiceModel.Description.IContractBehaviorAttribute chování vlastní smlouvy. V tomto případě je chování při použití na:

•Rozhraní kontraktu. 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 kontraktu, jehož hodnotou TargetContract je vlastnost.

•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, jsou primárním mechanismem, kterým upravíte celou službu nebo dobu spuštění klienta pro konkrétní koncový bod.

Existují dva mechanismy pro přidání chování koncových bodů do služby.

  1. Přidejte chování do Behaviors vlastnosti.

  2. 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í k rozšíření modulu runtime klienta i služby pro každou operaci.

Existují dva mechanismy pro přidání chování operací do operace. 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 objektu nebo do objektu ServiceHostChannelFactoryWCF přidá všechny IOperationBehavior atributy do kolekce chování vytvořené pro danou OperationDescription 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í a OperationBehaviorAttributeTransactionFlowAttribute.

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ář mohli zveřejnit chování pomocí konfigurace, musí vytvořit odvozenou třídu BehaviorExtensionElement rozšíření 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, musí být zaregistrovaný 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í

A System.ServiceModel.ChannelFactory<TChannel> jsou System.ServiceModel.ServiceHost zodpovědné za sestavení modulu runtime z programovacího modelu a popisu. 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.

Chování ServiceHost se používá v následujícím pořadí:

  1. Služba

  2. Smlouva

  3. Koncový bod

  4. Operace

V rámci jakékoli kolekce chování není zaručeno žádné pořadí.

Chování ChannelFactory<TChannel> se používá v následujícím pořadí:

  1. Smlouva

  2. Koncový bod

  3. Operace

V jakékoli kolekci chování opět není zaručeno žádné pořadí.

Programové přidávání chování

System.ServiceModel.Description.ServiceDescription Vlastnosti aplikace služby nesmí být změněny po metodě na CommunicationObject.OnOpeningSystem.ServiceModel.ServiceHostBase. Někteří členové, jako je ServiceHostBase.Credentials vlastnost a AddServiceEndpoint metody zapnuta ServiceHostBase a System.ServiceModel.ServiceHost, vyvolá výjimku, pokud byla změněna v tomto bodu. Ostatní vám umožňují je upravovat, ale výsledek je nedefinovaný.

Podobně v klientovi System.ServiceModel.Description.ServiceEndpoint nesmí být hodnoty změněny po volání OnOpening na System.ServiceModel.ChannelFactorystraně . 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 je služba nebo klient, doporučujeme před voláním CommunicationObject.Openupravit popis .

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í služby

Pro danou třídu služby se použijí všechny atributy chování služby pro danou třídu a 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, AspNetCompatibilityRequirementsMode režimem Allowed, a ConcurrencyMode s Single. . SingleJe to ConcurrencyMode proto, že ServiceBehaviorAttribute atribut ve službě B je "odvozenější" než atribut ve službě A.

Chování kontraktů

U daného kontraktu se použijí všechny atributy chování kontraktů v daném rozhraní a nadřazené rozhraní. 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 pro danou operaci a nadřazené objekty této 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.