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.
A sezení je korelace všech zpráv odeslaných mezi dvěma koncovými body. Instancování označuje řízení životnosti uživatelsky definovaných objektů služby a souvisejících InstanceContext objektů. Souběžnost je termín používaný pro kontrolu počtu vláken, která jsou spuštěna ve InstanceContext ve stejnou dobu.
Toto téma popisuje tato nastavení, způsob jejich použití a různé interakce mezi nimi.
Zasedání
Když smlouva služby nastaví vlastnost ServiceContractAttribute.SessionMode na SessionMode.Required, tato smlouva říká, že všechna volání (tj. výměny zpráv, které podporují tato 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í konceptuální vlastnosti:
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í.
Sezení seskupují 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. Vlastnosti, které vyplývají 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í pracovat přímo s InstanceContext nebo implementací zprostředkovatele kontextu vlastní instance.
Vytváření instancí
Chování vytváření instancí (nastavené pomocí ServiceBehaviorAttribute.InstanceContextMode vlastnosti) řídí, jak je InstanceContext vytvořeno 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í instanční módy.
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 řídí, kdy je uvolněn objekt služby.
Well-Known Singleton Services
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 je vyvolána výjimka 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ě. Například volání InstanceContext.ReleaseServiceInstance nemá žádný vliv, pokud je k dispozici instance objektu singleton. Podobně se ignoruje jakýkoli jiný mechanismus uvolnění instance. ServiceHost se vždy chová tak, jako by byla vlastnost OperationBehaviorAttribute.ReleaseInstanceMode nastavena na ReleaseInstanceMode.None při všech operacích.
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.
Konkurentnost
Souběžnost je kontrola počtu vláken aktivních v InstanceContext v libovolném okamžiku. To se řídí pomocí ServiceBehaviorAttribute.ConcurrencyMode s výčtem ConcurrencyMode.
K dispozici jsou následující tři režimy souběžnosti:
Single: Každý kontext instance může mít najednou maximálně jedno vlákno zpracovávající zprávy 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á jednu zprávu najednou, ale přijímá znovu-vstupující operace. Služba přijímá tato volání pouze při volání prostřednictvím klientského objektu WCF.
Poznámka:
Pochopení a vypracování kódu, který bezpečně využívá více než jedno vlákno, může být obtížné úspěšně napsat. 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 v tématu ConcurrencyMode.
Použití paralelismu souvisí s režimem instancování. 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ím InstanceContext
Relace a InstanceContext interagují v závislosti na kombinaci hodnot výčtu SessionMode ve smlouvě a vlastnosti ServiceBehaviorAttribute.InstanceContextMode v implementaci 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: InstanceContext pro každé volání. |
– Chování s kanálem, který udržuje stav relace: Vyvolá se výjimka. - Chování s kanálem bez relace: InstanceContext pro každé volání. |
| Persession | - Chování s kanálem s relací: Relace a InstanceContext pro každý kanál. – Chování s kanálem bez relace: Vyvolá se výjimka. |
- Chování s kanálem s relací: Relace a InstanceContext pro každý kanál. - Chování s kanálem bez relace: InstanceContext pro každé volání. |
– Chování s kanálem, který udržuje stav relace: Vyvolá se výjimka. - Chování s kanálem bez relace: InstanceContext pro každé volání. |
| Jediný | – Chování s kanálem, který podporuje relace: Jedna relace a jeden 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, který udržuje stav relace: Vyvolá se výjimka. - Chování s kanálem bez relace: Pro každý vytvořený InstanceContext singleton nebo pro uživatelem zadaný singleton. |