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


Munkamenetek használata

A Windows Communication Foundation (WCF) alkalmazásokban a munkamenetek egy üzenetcsoportot egy beszélgetésbe kapcsolnak össze. A WCF-munkamenetek eltérnek az ASP.NET alkalmazásokban elérhető munkamenet-objektumtól, támogatják a különböző viselkedéseket, és különböző módokon vezérelhetők. Ez a témakör azokat a funkciókat ismerteti, amelyeket a munkamenetek engedélyeznek a WCF-alkalmazásokban, és hogyan használhatja őket.

Munkamenetek a Windows Communication Foundation-alkalmazásokban

Ha egy szolgáltatási szerződés azt határozza meg, hogy munkamenetre van szükség, a szerződés azt határozza meg, hogy minden hívásnak (vagyis a hívásokat támogató mögöttes üzenetcseréknek) ugyanabba a beszélgetésbe kell tartoznia. 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 hozhatnak létre munkamenetet. Ha a munkamenet véget ér, és a rendszer egy üzenetet küld ugyanazon a csatornán, a rendszer kivételt küld.

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

  • Ezeket a hívó alkalmazás (a WCF-ügyfél) kifejezetten kezdeményezi és szünteti meg.

  • 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. Különböző típusú korrelációk lehetségesek. 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.

Ez a témakör a következőket ismerteti:

  • Az alapértelmezett végrehajtási viselkedés munkamenet-alapú kötések szolgáltatásmodell-rétegben való használatakor.

  • A WCF munkamenet-alapú, rendszer által biztosított kötések által biztosított szolgáltatások típusai.

  • Munkamenet-követelményt deklaráló szerződés létrehozása.

  • A munkamenet létrehozásának és befejezésének, valamint a munkamenetnek a szolgáltatáspéldányhoz való viszonyának megértése és szabályozása.

Alapértelmezett végrehajtási viselkedés munkamenetek használatával

A munkamenetet kezdeményező kötéseket munkamenet-alapú kötésnek nevezzük. A szolgáltatási szerződések úgy határozzák meg, hogy munkamenet-alapú kötéseket igényelnek, engedélyeznek vagy elutasítanak, ha a ServiceContractAttribute.SessionMode szolgáltatásszerződés felületének (vagy osztályának) tulajdonságát az System.ServiceModel.SessionMode enumerálási értékek egyikére állítja. Alapértelmezés szerint ennek a tulajdonságnak Allowedaz értéke az, ami azt jelenti, hogy ha egy ügyfél munkamenet-alapú kötést használ EGY WCF-szolgáltatás implementációjával, a szolgáltatás létrehozza és használja a megadott munkamenetet.

Ha egy WCF-szolgáltatás elfogad egy ügyfél-munkamenetet, alapértelmezés szerint a következő funkciók lesznek engedélyezve:

  1. A WCF-ügyfélobjektumok közötti összes hívást ugyanaz a szolgáltatáspéldány kezeli.

  2. A különböző munkamenet-alapú kötések további funkciókat biztosítanak.

Rendszer által biztosított munkamenettípusok

A munkamenet-alapú kötések támogatják egy szolgáltatáspéldány alapértelmezett társítását egy adott munkamenettel. A különböző munkamenet-alapú kötések azonban a korábban ismertetett munkamenetalapú instancing vezérlő engedélyezésén kívül különböző funkciókat is támogatnak.

A WCF a munkamenet-alapú alkalmazás viselkedésének alábbi típusait biztosítja:

A SessionMode tulajdonság beállítása nem határozza meg a szerződés által igényelt munkamenet típusát, csak azt, hogy ehhez szükséges.

Munkamenetet igénylő szerződés létrehozása

Egy munkamenetet igénylő szerződés létrehozása azt állítja, hogy a szolgáltatási szerződés által deklarált műveletek csoportját ugyanabban a munkamenetben kell végrehajtani, és az üzeneteket sorrendben kell kézbesíteni. A szolgáltatási szerződés által igényelt munkamenet-támogatás mértékének érvényesítéséhez állítsa a ServiceContractAttribute.SessionMode szolgáltatási szerződés felületének vagy osztályának tulajdonságát az System.ServiceModel.SessionMode enumerálás értékére annak meghatározásához, hogy a szerződés:

  • Munkamenetet igényel.

  • Lehetővé teszi az ügyfél számára, hogy munkamenetet hozzon létre.

  • Tiltja a munkamenetet.

A SessionMode tulajdonság beállítása azonban nem határozza meg a szerződés által igényelt munkamenetalapú viselkedés típusát. Utasítja a WCF-et, hogy futásidőben erősítse meg, hogy a szolgáltatáshoz konfigurált kötés (amely létrehozza a kommunikációs csatornát) nem, vagy nem tud munkamenetet létrehozni a szolgáltatás megvalósításakor. A kötés ezt a követelményt a választott munkamenet-alapú viselkedéssel ( biztonság, átvitel, megbízható vagy valamilyen kombináció) is képes kielégíteni. A pontos viselkedés a System.ServiceModel.SessionMode kiválasztott értéktől függ. Ha a szolgáltatás konfigurált kötése nem felel meg az értéknek SessionMode, a rendszer kivételt okoz. A kötések és az általuk létrehozott csatornák, amelyek támogatják a munkameneteket, azt mondják, hogy munkamenet-alapúak.

A következő szolgáltatási szerződés azt határozza meg, hogy a ICalculatorSession munkameneten belül minden műveletet cserélni kell. Egyik művelet sem ad vissza értéket a hívónak, kivéve a metódust Equals . A Equals metódus azonban nem használ paramétereket, ezért csak egy nem nulla értéket tud visszaadni egy munkameneten belül, amelyben az adatok már át lettek adva a többi műveletnek. A szerződésnek megfelelően kell működnie egy munkamenetnek. Egy adott ügyfélhez társított munkamenet nélkül a szolgáltatáspéldány nem tudja, hogy az ügyfél milyen korábbi adatokat küldött.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
    [OperationContract(IsOneWay=true)]
    void Clear();
    [OperationContract(IsOneWay = true)]
    void AddTo(double n);
    [OperationContract(IsOneWay = true)]
    void SubtractFrom(double n);
    [OperationContract(IsOneWay = true)]
    void MultiplyBy(double n);
    [OperationContract(IsOneWay = true)]
    void DivideBy(double n);
    [OperationContract]
    double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession

    <OperationContract(IsOneWay:=True)> _
    Sub Clear()
    <OperationContract(IsOneWay:=True)> _
    Sub AddTo(ByVal n As Double)
    <OperationContract(IsOneWay:=True)> _
    Sub SubtractFrom(ByVal n As Double)
    <OperationContract(IsOneWay:=True)> _
    Sub MultiplyBy(ByVal n As Double)
    <OperationContract(IsOneWay:=True)> _
    Sub DivideBy(ByVal n As Double)
    <OperationContract()> _
    Function Equal() As Double
End Interface

Ha egy szolgáltatás engedélyezi a munkamenetet, akkor létrejön egy munkamenet, és akkor lesz használatban, ha az ügyfél kezdeményez egyet; ellenkező esetben nem jön létre munkamenet.

Munkamenetek és szolgáltatáspéldányok

Ha a WCF-ben az alapértelmezett instancing viselkedést használja, a WCF-ügyfélobjektumok közötti összes hívást ugyanaz a szolgáltatáspéldány kezeli. Ezért az alkalmazás szintjén úgy tekinthet egy munkamenetre, mint amely lehetővé teszi az alkalmazás viselkedését a helyi hívási viselkedéshez hasonlóan. Például helyi objektum létrehozásakor:

  • Konstruktort hívunk.

  • A WCF-ügyfélobjektum-referencia minden további hívását ugyanaz az objektumpéldány dolgozza fel.

  • A destruktort akkor hívjuk meg, ha az objektumhivatkozás megsemmisül.

A munkamenetek hasonló viselkedést tesznek lehetővé az ügyfelek és a szolgáltatások között mindaddig, amíg az alapértelmezett szolgáltatáspéldány-viselkedést használják. Ha egy szolgáltatási szerződés munkameneteket igényel vagy támogat, egy vagy több szerződésműveletet megjelölhet munkamenet kezdeményezőjeként vagy megszakításaként a tulajdonságok és IsTerminating a IsInitiating tulajdonságok beállításával.

A kezdeményező műveletek azok, amelyeket egy új munkamenet első műveleteként kell meghívni. A nem kezdeményező műveletek csak akkor hívhatók meg, ha legalább egy kezdeményező műveletet meghívtak. Ezért létrehozhat egyfajta munkamenet-konstruktort a szolgáltatáshoz úgy, hogy deklarál olyan kezdeményező műveleteket, amelyek úgy lettek kialakítva, hogy a szolgáltatáspéldány elejéhez igazodva fogadják a bemenetet az ügyfelektől. (Az állapot azonban a munkamenethez van társítva, nem pedig a szolgáltatásobjektumhoz.)

A művelet megszakítása ezzel szemben azok, amelyeket egy meglévő munkamenet utolsó üzeneteként kell meghívni. Az alapértelmezett esetben a WCF újrahasznosítja a szolgáltatásobjektumot és annak környezetét azt követően, hogy a szolgáltatáshoz társított munkamenet lezárult. Ezért létrehozhat egyfajta destruktort úgy, hogy deklarálja a szolgáltatáspéldány végének megfelelő függvény végrehajtására tervezett leállási műveleteket.

Feljegyzés

Bár az alapértelmezett viselkedés hasonló a helyi konstruktorokhoz és destruktorokhoz, ez csak hasonlóság. Bármely WCF-szolgáltatásművelet kezdeményező vagy megszüntető művelet lehet, vagy mindkettő egyszerre. Emellett az alapértelmezett esetben a kezdeményező műveletek tetszőleges számú alkalommal hívhatók meg bármilyen sorrendben; a munkamenet létrehozása és társítása után nem jön létre további munkamenet, kivéve, ha explicit módon szabályozza a szolgáltatáspéldány élettartamát (az System.ServiceModel.InstanceContext objektum módosításával). Végül az állapot a munkamenethez van társítva, nem a szolgáltatásobjektumhoz.

Az előző példában használt szerződés például megköveteli, ICalculatorSession hogy a WCF-ügyfélobjektum minden más művelet előtt hívja meg a Clear műveletet, és hogy a WCF-ügyfélobjektummal folytatott munkamenetnek le kell fejeződnie, amikor meghívja a Equals műveletet. Az alábbi példakód egy olyan szerződést mutat be, amely kikényszeríti ezeket a követelményeket. Clear először meg kell hívni egy munkamenetet, és a munkamenet akkor fejeződik be, amikor Equals a rendszer meghívja.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
    [OperationContract(IsOneWay=true, IsInitiating=true, IsTerminating=false)]
    void Clear();
    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
    void AddTo(double n);
    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
    void SubtractFrom(double n);
    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
    void MultiplyBy(double n);
    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
    void DivideBy(double n);
    [OperationContract(IsInitiating = false, IsTerminating = true)]
    double Equals();
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples", SessionMode:=SessionMode.Required)> _
Public Interface ICalculatorSession

    <OperationContract(IsOneWay:=True, IsInitiating:=True, IsTerminating:=False)> _
    Sub Clear()
    <OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
    Sub AddTo(ByVal n As Double)
    <OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
    Sub SubtractFrom(ByVal n As Double)
    <OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
    Sub MultiplyBy(ByVal n As Double)
    <OperationContract(IsOneWay:=True, IsInitiating:=False, IsTerminating:=False)> _
    Sub DivideBy(ByVal n As Double)
    <OperationContract(IsInitiating:=False, IsTerminating:=True)> _
    Function Equal() As Double
End Interface

A szolgáltatások nem indítanak munkameneteket az ügyfelekkel. A WCF-ügyfélalkalmazásokban közvetlen kapcsolat áll fenn a munkamenet-alapú csatorna élettartama és maga a munkamenet élettartama között. Ezért az ügyfelek új munkameneteket hoznak létre új munkamenet-alapú csatornák létrehozásával, és a munkamenet-alapú csatornák elegáns bezárásával lebontják a meglévő munkameneteket. Az ügyfél egy szolgáltatásvégponttal indít egy munkamenetet az alábbiak egyikének meghívásával:

  • ICommunicationObject.Open a hívás által visszaadott csatornán ChannelFactory<TChannel>.CreateChannel.

  • ClientBase<TChannel>.Opena ServiceModel Metadata Segédprogram (Svcutil.exe) által létrehozott WCF-ügyfélobjektumon.

  • Kezdeményező művelet a WCF-ügyfélobjektumok bármelyik típusán (alapértelmezés szerint minden művelet kezdeményező). Az első művelet meghívásakor a WCF-ügyfélobjektum automatikusan megnyitja a csatornát, és munkamenetet kezdeményez.

Az ügyfél általában egy szolgáltatásvégponttal zárja le a munkamenetet az alábbiak egyikének meghívásával:

  • ICommunicationObject.Close a hívás által visszaadott csatornán ChannelFactory<TChannel>.CreateChannel.

  • ClientBase<TChannel>.Close a Svcutil.exe által létrehozott WCF-ügyfélobjektumon.

  • A WCF-ügyfélobjektumok bármelyik típusán végződő művelet (alapértelmezés szerint nem végződnek műveletek; a szerződésnek explicit módon meg kell adnia egy megszüntetési műveletet). Az első művelet meghívásakor a WCF-ügyfélobjektum automatikusan megnyitja a csatornát, és munkamenetet kezdeményez.

Példák: Útmutató: Munkameneteket igénylő szolgáltatás létrehozása, valamint az alapértelmezett szolgáltatás viselkedése és instancing mintái.

További információ az ügyfelekről és a munkamenetekről: Accessing Services Using a WCF Client.

A munkamenetek az InstanceContext Gépház

A szerződés enumerálása és a ServiceBehaviorAttribute.InstanceContextMode tulajdonság közötti SessionMode interakció szabályozza a csatornák és az adott szolgáltatásobjektumok közötti társítást. További információ: Munkamenetek, Instancing és Egyidejűség.

InstanceContext-objektumok megosztása

Azt is szabályozhatja, hogy melyik munkamenet-alapú csatorna vagy hívás melyik objektumhoz InstanceContext van társítva az adott társítás végrehajtásával.

Munkamenetek és streamelés

Ha nagy mennyiségű adatot kell továbbítania, a WCF streamátviteli módja megvalósítható alternatíva a memóriában lévő üzenetek pufferelésének és feldolgozásának alapértelmezett viselkedése helyett. Váratlan viselkedést kaphat, ha munkamenet-alapú kötéssel streameli a hívásokat. Az összes streamelési hívás egyetlen csatornán (a datagram csatornán) keresztül történik, amely akkor sem támogatja a munkameneteket, ha a használt kötés munkamenetek használatára van konfigurálva. Ha több ügyfél streameli a hívásokat ugyanarra a szolgáltatásobjektumra egy munkamenet-alapú kötésen keresztül, és a szolgáltatásobjektum egyidejűségi üzemmódja egyetlenre van állítva, és a példány környezeti üzemmódja be van állítva PerSession, minden hívásnak át kell mennie a datagram csatornán, így egyszerre csak egy hívás lesz feldolgozva. Egy vagy több ügyfél időtúllépést okozhat. A probléma megoldásához állítsa a szolgáltatásobjektum InstanceContextMode értékét többre PerCall , vagy az egyidejűséget többre.

Feljegyzés

A MaxConcurrentSessions nincs hatással ebben az esetben, mert csak egy "munkamenet" érhető el.

Lásd még