Megosztás a következőn keresztül:


Munkamenetek, instancing és egyidejűség

A munkamenet a két végpont között küldött összes üzenet korrelációja. Az instancing a felhasználó által definiált szolgáltatásobjektumok és azok kapcsolódó InstanceContext objektumainak élettartamát szabályozza. Az egyidejűség az egyidejűleg végrehajtó InstanceContext szálak számának szabályozására adott kifejezés.

Ez a témakör ezeket a beállításokat, azok használatát és a köztük lévő különböző interakciókat ismerteti.

Előadások

Amikor egy szolgáltatási szerződés beállítja a ServiceContractAttribute.SessionMode tulajdonságot SessionMode.Required, az a szerződés azt mondja, hogy minden hívásnak (vagyis a hívásokat támogató mögöttes üzenetcseréknek) ugyanazon beszélgetésnek kell lennie. Ha egy szerződés azt határozza meg, hogy engedélyezi a munkameneteket, de nem igényel egyet, az ügyfelek csatlakozhatnak, és létrehozhatnak egy munkamenetet, vagy nem. Ha a munkamenet véget ér, és a rendszer egy üzenetet küld ugyanazon a munkamenet-alapú csatornán, a rendszer kivételt küld.

A WCF-munkamenetek a következő fő fogalmi jellemzőkkel rendelkeznek:

  • A hívó alkalmazás kifejezetten kezdeményezi és leállítja őket.

  • A munkamenet során kézbesített üzenetek feldolgozása a beérkezés sorrendjében történik.

  • A munkamenetek egy üzenetcsoportot egy beszélgetésbe kapcsolnak össze. A korreláció jelentése absztrakció. Egy munkamenet-alapú csatorna például egy megosztott hálózati kapcsolaton alapuló üzeneteket korrelálhat, míg egy másik munkamenet-alapú csatorna az üzeneteket az üzenet törzsében található megosztott címke alapján korrelálhatja. A munkamenetből levezethető funkciók a korreláció jellegétől függenek.

  • A WCF-munkamenethez nincs általános adattár társítva.

Ha ismeri ASP.NET System.Web.SessionState.HttpSessionState alkalmazások osztályát és az általa nyújtott funkciókat, az alábbi különbségeket tapasztalhatja az ilyen típusú munkamenetek és a WCF-munkamenetek között:

  • ASP.NET munkamenetek mindig kiszolgáló által kezdeményezettek.

  • ASP.NET munkamenetek implicit módon rendezetlenek.

  • ASP.NET munkamenetek általános adattárolási mechanizmust biztosítanak a kérések között.

Az ügyfélalkalmazások és a szolgáltatásalkalmazások különböző módokon használják a munkameneteket. Az ügyfélalkalmazások munkameneteket kezdeményeznek, majd fogadják és feldolgozzák a munkameneten belül küldött üzeneteket. A szolgáltatásalkalmazások bővíthetőségi pontként használhatják a munkameneteket további viselkedés hozzáadásához. Ehhez közvetlenül az InstanceContext egyéni példány környezetszolgáltatójával kell együttműködni vagy implementálni.

Instancing

Az instancing (a ServiceBehaviorAttribute.InstanceContextMode tulajdonság használatával beállított) viselkedés szabályozza a létrehozás módját a InstanceContext bejövő üzenetekre válaszul. Alapértelmezés szerint mindegyik InstanceContext egy felhasználó által definiált szolgáltatásobjektumhoz van társítva, így (az alapértelmezett esetben) a InstanceContextMode tulajdonság beállítása a felhasználó által definiált szolgáltatásobjektumok instancingját is szabályozza. Az InstanceContextMode enumerálás határozza meg az instancing módokat.

A következő instancing módok érhetők el:

  • PerCall: Minden ügyfélkéréshez létrejön egy új InstanceContext (és ezért szolgáltatásobjektum).

  • PerSession: Minden új ügyfél-munkamenethez létrejön egy új InstanceContext (és ezért szolgáltatásobjektum), amely a munkamenet teljes élettartama alatt megmarad (ehhez a munkameneteket támogató kötésre van szükség).

  • Single: Egyetlen InstanceContext (és ezért szolgáltatásobjektum) kezeli az alkalmazás teljes élettartamára vonatkozó összes ügyfélkérést.

Az alábbi példakód az alapértelmezett InstanceContextMode értéket mutatja be, PerSession amely kifejezetten egy szolgáltatásosztályon van beállítva.

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

És bár a tulajdonság szabályozza a ServiceBehaviorAttribute.InstanceContextModeInstanceContext kiadás gyakoriságát, a szolgáltatásobjektum felszabadításakor a OperationBehaviorAttribute.ReleaseInstanceMode tulajdonságok és ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete a tulajdonságok szabályozzák.

Jól ismert Singleton Services

Az egypéldányos szolgáltatásobjektumok egyik változata néha hasznos: létrehozhat saját maga egy szolgáltatásobjektumot, és ezzel az objektummal hozhatja létre a szolgáltatás gazdagépét. Ehhez a ServiceBehaviorAttribute.InstanceContextMode tulajdonságot Single is be kell állítania, vagy kivételt kell eredményeznie a szolgáltatás gazdagépének megnyitásakor.

Használja a ServiceHost(Object, Uri[]) konstruktort egy ilyen szolgáltatás létrehozásához. Alternatívát kínál az egyéni System.ServiceModel.Dispatcher.IInstanceContextInitializer implementáláshoz, ha egy adott objektumpéldányt szeretne megadni egy adott szolgáltatás számára. Ezt a túlterhelést akkor használhatja, ha a szolgáltatás implementálási típusa nehezen konstruálható (például ha nem implementál paraméter nélküli nyilvános konstruktort).

Vegye figyelembe, hogy ha a konstruktornak egy objektumot ad meg, a Windows Communication Foundation (WCF) instancing viselkedésével kapcsolatos egyes funkciók eltérően működnek. A hívásnak InstanceContext.ReleaseServiceInstance például nincs hatása egy egyszeri objektumpéldány megadásakor. Hasonlóképpen minden más példánykiadási mechanizmus figyelmen kívül lesz hagyva. A ServiceHost mindig úgy viselkedik, mintha a OperationBehaviorAttribute.ReleaseInstanceMode tulajdonság minden művelethez be van állítva ReleaseInstanceMode.None .

InstanceContext-objektumok megosztása

A társítás végrehajtásával azt is szabályozhatja, hogy melyik munkamenet-csatornához InstanceContext vagy híváshoz melyik objektum tartozik.

Egyidejűség

Az egyidejűség az egy adott időpontban InstanceContext aktív szálak számának szabályozása. Ezt az ServiceBehaviorAttribute.ConcurrencyMode enumerálással ConcurrencyMode szabályozhatja.

A következő három egyidejűségi mód érhető el:

  • Single: Minden példánykörnyezetben egyszerre legfeljebb egy szálfeldolgozási üzenet szerepelhet a példánykörnyezetben. Az azonos példánykörnyezetet használni kívánó többi szálnak blokkolnia kell, amíg az eredeti szál ki nem lép a példánykörnyezetből.

  • Multiple: Minden szolgáltatáspéldány több szálat is képes egyszerre feldolgozni. Ennek az egyidejűségi módnak a használatához a szolgáltatás implementációjának szálbiztosnak kell lennie.

  • Reentrant: Minden szolgáltatáspéldány egyszerre egy üzenetet dolgoz fel, de fogadja az újrakezdő műveleti hívásokat. A szolgáltatás csak akkor fogadja ezeket a hívásokat, ha EGY WCF-ügyfélobjektumon keresztül hív ki.

Feljegyzés

Az egynél több szálat biztonságosan használó kód megértése és fejlesztése nehéz lehet sikeresen írni. Használat Multiple vagy Reentrant értékek előtt győződjön meg arról, hogy a szolgáltatás megfelelően van kialakítva ezekhez a módokhoz. További információ: ConcurrencyMode.

Az egyidejűség használata az instancing módhoz kapcsolódik. Instancing PerCall , egyidejűség nem releváns, mert minden üzenetet dolgoz fel egy új InstanceContext , és ezért soha nem több szál aktív a InstanceContext.

Az alábbi példakód bemutatja a tulajdonság beállítását a ConcurrencyMode következőre Multiple: .

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

A munkamenetek az InstanceContext Gépház

Munkamenetek és InstanceContext interakciók a szerződés enumerálási értékének és a ServiceBehaviorAttribute.InstanceContextMode szolgáltatás-megvalósítás tulajdonságának SessionMode kombinációjától függően, amely szabályozza a csatornák és adott szolgáltatásobjektumok közötti társítást.

Az alábbi táblázat egy bejövő csatorna eredményét mutatja, amely vagy támogatja a munkameneteket, vagy nem támogatja a munkameneteket, ha a szolgáltatás a tulajdonság és a ServiceContractAttribute.SessionModeServiceBehaviorAttribute.InstanceContextMode tulajdonság értékeinek kombinációját adja.

InstanceContextMode érték Required Allowed NotAllowed
PerCall - Viselkedés munkamenet-csatornával: Egy munkamenet és InstanceContext minden hívás esetében.
- Viselkedés munkamenet nélküli csatornával: A rendszer kivételt jelez.
- Viselkedés munkamenet-csatornával: Egy munkamenet és InstanceContext minden hívás esetében.
- Viselkedés munkamenet nélküli csatornával: Minden InstanceContext híváshoz tartozik.
- Viselkedés munkamenet-csatornával: A rendszer kivételt jelez.
- Viselkedés munkamenet nélküli csatornával: Minden InstanceContext híváshoz tartozik.
PerSession - Viselkedés munkamenet-csatornával: Egy munkamenet és InstanceContext minden csatorna esetében.
- Viselkedés munkamenet nélküli csatornával: A rendszer kivételt jelez.
- Viselkedés munkamenet-csatornával: Egy munkamenet és InstanceContext minden csatorna esetében.
- Viselkedés munkamenet nélküli csatornával: Minden InstanceContext híváshoz tartozik.
- Viselkedés munkamenet-csatornával: A rendszer kivételt jelez.
- Viselkedés munkamenet nélküli csatornával: Minden InstanceContext híváshoz tartozik.
Egyszeres - Viselkedés munkamenet-csatornával: Egy munkamenet és egy InstanceContext az összes híváshoz.
- Viselkedés munkamenet nélküli csatornával: A rendszer kivételt jelez.
- Viselkedés munkamenet-csatornával: Munkamenet és InstanceContext a létrehozott vagy felhasználó által megadott egytonnára vonatkozóan.
- Viselkedés munkamenet nélküli csatornával: A InstanceContext létrehozott vagy a felhasználó által megadott singleton.
- Viselkedés munkamenet-csatornával: A rendszer kivételt jelez.
- Viselkedés munkamenet nélküli csatornával: Minden InstanceContext egyes létrehozott egyton vagy a felhasználó által megadott egytonnára vonatkozó viselkedés.

Lásd még