Relace, vytváření instancí a souběžnost

Relace je korelace všech zpráv odeslaných mezi dvěma koncovými body. Vytváření instancí označuje řízení životnosti uživatelem definovaných objektů služby a souvisejících InstanceContext objektů. Souběžnost je termín zadaný ovládacím prvkům počtu vláken spuštěných ve InstanceContext stejnou dobu.

Toto téma popisuje tato nastavení, způsob jejich použití a různé interakce mezi nimi.

Přednášky

Když kontrakt služby nastaví ServiceContractAttribute.SessionMode vlastnost SessionMode.Requiredna , tato smlouva říká, že všechna volání (tj. podkladová výměna zpráv podporující volání) musí být součástí stejné konverzace. Pokud kontrakt určuje, že umožňuje relace, ale nevyžaduje ho, klienti se mohou připojit a buď vytvořit relaci, nebo ne. Pokud relace skončí a zpráva se odešle přes stejný kanál založený na relaci, vyvolá se výjimka.

Relace WCF mají následující hlavní koncepční funkce:

  • Jsou explicitně inicializovány a ukončeny volající aplikací.

  • Zprávy doručované během relace se zpracovávají v pořadí, ve kterém se přijímají.

  • Relace korelují skupinu zpráv do konverzace. Význam této korelace je abstrakce. Jeden kanál založený na relaci může například korelovat zprávy založené na sdíleném síťovém připojení, zatímco jiný kanál založený na relaci může korelovat zprávy na základě sdílené značky v textu zprávy. Funkce, které lze odvodit z relace, závisí na povaze korelace.

  • K relaci WCF není přidružené žádné obecné úložiště dat.

Pokud znáte System.Web.SessionState.HttpSessionState třídu v ASP.NET aplikacích a funkcích, které poskytuje, můžete si všimnout následujících rozdílů mezi tímto druhem relací a relacemi WCF:

  • ASP.NET relace jsou vždy zahájeny serverem.

  • ASP.NET relace jsou implicitně neuspořádané.

  • ASP.NET relace poskytují obecný mechanismus úložiště dat napříč požadavky.

Klientské aplikace a aplikace služeb komunikují s relacemi různými způsoby. Klientské aplikace inicialují relace a pak přijímají a zpracovávají zprávy odeslané v rámci relace. Aplikace služeb můžou používat relace jako bod rozšiřitelnosti a přidávat další chování. To se provádí přímo se InstanceContext zprostředkovatelem kontextu vlastní instance nebo implementací.

Vytváření instancí

Chování vytváření instancí (nastavené pomocí ServiceBehaviorAttribute.InstanceContextMode vlastnosti) řídí způsob InstanceContext vytvoření v reakci na příchozí zprávy. Ve výchozím nastavení je každý InstanceContext přidružený k jednomu objektu služby definované uživatelem, takže (ve výchozím případě) nastavení InstanceContextMode vlastnosti také řídí instanci uživatelem definovaných objektů služby. Výčet InstanceContextMode definuje režimy vytváření instancí.

K dispozici jsou následující režimy vytváření instancí:

  • PerCall: Pro každý požadavek klienta se vytvoří nový InstanceContext (a proto objekt služby).

  • PerSession: Pro každou novou relaci klienta se vytvoří nový InstanceContext (a proto objekt služby) a udržuje se po celou dobu životnosti této relace (to vyžaduje vazbu, která podporuje relace).

  • Single: Jeden InstanceContext (a proto objekt služby) zpracovává všechny požadavky klientů po celou dobu životnosti aplikace.

Následující příklad kódu ukazuje výchozí InstanceContextMode hodnotu, PerSession která je explicitně nastavena ve třídě služby.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorInstance
{
    ...  
}  

A zatímco ServiceBehaviorAttribute.InstanceContextMode vlastnost řídí, jak často InstanceContext je vydána, OperationBehaviorAttribute.ReleaseInstanceMode a ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete vlastnosti řízení při uvolnění objektu služby.

Známé služby Singleton

Jedna varianta objektů služby s jednou instancí je někdy užitečná: objekt služby můžete vytvořit sami a vytvořit hostitele služby pomocí daného objektu. Chcete-li to provést, musíte také nastavit ServiceBehaviorAttribute.InstanceContextMode vlastnost na Single nebo výjimku je vyvolán při otevření hostitele služby.

Pomocí konstruktoru ServiceHost(Object, Uri[]) vytvořte takovou službu. Poskytuje alternativu k implementaci vlastního System.ServiceModel.Dispatcher.IInstanceContextInitializer objektu, pokud chcete poskytnout konkrétní instanci objektu pro použití službou singleton. Toto přetížení můžete použít, pokud je typ implementace služby obtížné sestavit (například pokud neimplementuje veřejný konstruktor bez parametrů).

Všimněte si, že když je objekt poskytnut tomuto konstruktoru, některé funkce související s chováním instance Wcf (Windows Communication Foundation) fungují odlišně. Volání například nemá žádný vliv, InstanceContext.ReleaseServiceInstance pokud je k dispozici instance objektu singleton. Podobně se ignoruje jakýkoli jiný mechanismus uvolnění instance. Vždy ServiceHost se chová, jako by OperationBehaviorAttribute.ReleaseInstanceMode vlastnost byla nastavena ReleaseInstanceMode.None pro všechny operace.

Sdílení objektů InstanceContext

Můžete také určit, který kanál relace nebo volání je přidružen k jakému InstanceContext objektu provedením přidružení sami.

Souběžnost

Souběžnost je kontrola počtu vláken aktivních v libovolném okamžiku InstanceContext . To se řídí pomocí výčtu ServiceBehaviorAttribute.ConcurrencyModeConcurrencyMode .

K dispozici jsou následující tři režimy souběžnosti:

  • Single: Každý kontext instance může mít najednou maximálně jednu zprávu zpracování vláken v kontextu instance. Ostatní vlákna, která chtějí použít stejný kontext instance, musí blokovat, dokud původní vlákno ukončí kontext instance.

  • Multiple: Každá instance služby může mít více vláken, která zpracovávají zprávy současně. Pro použití tohoto režimu souběžnosti musí být implementace služby bezpečná pro přístup z více vláken.

  • Reentrant: Každá instance služby zpracovává vždy jednu zprávu, ale přijímá volání operací opětovného účastníka. Služba přijímá tato volání pouze při volání prostřednictvím klientského objektu WCF.

Poznámka:

Pochopení a vývoj kódu, který bezpečně používá více než jedno vlákno, může být obtížné úspěšně psát. Před použitím Multiple nebo Reentrant hodnotami se ujistěte, že je vaše služba pro tyto režimy správně navržená. Další informace najdete na webu ConcurrencyMode.

Použití souběžnosti souvisí s režimem vytváření instancí. Při PerCall vytváření instancí není souběžnost relevantní, protože každá zpráva je zpracována novou InstanceContext zprávou, a proto nikdy více než jedno vlákno je aktivní v InstanceContext.

Následující příklad kódu ukazuje nastavení ConcurrencyMode vlastnosti na Multiple.

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculatorConcurrency
{
    ...  
}  

Relace interagují s Nastavení InstanceContext

Relace a InstanceContext interakce v závislosti na kombinaci hodnoty SessionMode výčtu ve smlouvě a ServiceBehaviorAttribute.InstanceContextMode vlastnosti implementace služby, která řídí přidružení mezi kanály a konkrétními objekty služby.

Následující tabulka ukazuje výsledek příchozího kanálu, který podporuje relace nebo nepodporuje relace s ohledem na kombinaci hodnot ServiceContractAttribute.SessionMode vlastnosti a ServiceBehaviorAttribute.InstanceContextMode vlastnosti služby.

Hodnota InstanceContextMode Required Allowed NotAllowed
PerCall - Chování s kanálem relace: Relace a InstanceContext pro každé volání.
– Chování s kanálem bez relace: Vyvolá se výjimka.
- Chování s kanálem relace: Relace a InstanceContext pro každé volání.
- Chování s kanálem bez relace: An InstanceContext pro každé volání.
– Chování s kanálem relace: Vyvolá se výjimka.
- Chování s kanálem bez relace: An InstanceContext pro každé volání.
Persession - Chování s kanálem relace: Relace a InstanceContext pro každý kanál.
– Chování s kanálem bez relace: Vyvolá se výjimka.
- Chování s kanálem relace: Relace a InstanceContext pro každý kanál.
- Chování s kanálem bez relace: An InstanceContext pro každé volání.
– Chování s kanálem relace: Vyvolá se výjimka.
- Chování s kanálem bez relace: An InstanceContext pro každé volání.
Jeden – Chování s kanálem relace: Relace a jedna InstanceContext pro všechna volání.
– Chování s kanálem bez relace: Vyvolá se výjimka.
– Chování s kanálem relace: Relace a InstanceContext pro vytvořený nebo uživatelem zadaný singleton.
– Chování s kanálem bez relace: Typ InstanceContext singletonu vytvořeného nebo uživatelem.
– Chování s kanálem relace: Vyvolá se výjimka.
- Chování s kanálem bez relace: Pro InstanceContext každý vytvořený singleton nebo pro uživatelem zadaný singleton.

Viz také