Dela via


Sessioner, instancing och samtidighet

En session är en korrelation mellan alla meddelanden som skickas mellan två slutpunkter. Instancing syftar på att styra livslängden för användardefinierade tjänstobjekt och deras relaterade InstanceContext objekt. Samtidighet är den term som ges till kontrollen av antalet trådar som körs i en InstanceContext på samma gång.

Det här avsnittet beskriver de här inställningarna, hur du använder dem och de olika interaktionerna mellan dem.

Sessioner

När ett tjänstkontrakt anger ServiceContractAttribute.SessionMode egenskapen till SessionMode.Required, säger det kontraktet att alla anrop (det vill säga de underliggande meddelandeutbyten som stöder anropen) måste ingå i samma konversation. Om ett kontrakt anger att det tillåter sessioner men inte kräver en, kan klienter ansluta och antingen upprätta en session eller inte. Om sessionen avslutas och ett meddelande skickas via samma sessionsbaserade kanal utlöses ett undantag.

WCF-sessioner har följande huvudsakliga konceptuella funktioner:

  • De initieras och avslutas uttryckligen av det anropande programmet.

  • Meddelanden som levereras under en session bearbetas i den ordning de tas emot.

  • Sessioner korrelerar en grupp meddelanden i en konversation. Innebörden av den korrelationen är en abstraktion. Till exempel kan en sessionsbaserad kanal korrelera meddelanden baserat på en delad nätverksanslutning, medan en annan sessionsbaserad kanal kan korrelera meddelanden baserat på en delad tagg i meddelandetexten. Vilka funktioner som kan härledas från sessionen beror på korrelationens natur.

  • Det finns inget allmänt datalager som är associerat med en WCF-session.

Om du är bekant med System.Web.SessionState.HttpSessionState klassen i ASP.NET program och de funktioner som den tillhandahåller kan du märka följande skillnader mellan den typen av sessioner och WCF-sessioner:

  • ASP.NET sessioner är alltid serverinitierade.

  • ASP.NET sessioner är implicit oordnade.

  • ASP.NET sessioner tillhandahåller en allmän mekanism för datalagring mellan begäranden.

Klientprogram och tjänstprogram interagerar med sessioner på olika sätt. Klientprogram initierar sessioner och tar sedan emot och bearbetar de meddelanden som skickas inom sessionen. Tjänstprogram kan använda sessioner som en utökningspunkt för att lägga till ytterligare beteende. Detta görs genom att arbeta direkt med InstanceContext eller implementera en anpassad instanskontextprovider.

Instancing

Instancing-beteendet (som anges med hjälp ServiceBehaviorAttribute.InstanceContextMode av egenskapen) styr hur InstanceContext skapas som svar på inkommande meddelanden. Som standard är var och InstanceContext en associerad med ett användardefinierat tjänstobjekt, så (i standardfallet) styr inställningen InstanceContextMode av egenskapen även instancing för användardefinierade tjänstobjekt. Uppräkningen InstanceContextMode definierar instancing-lägena.

Följande lägen för instancing är tillgängliga:

  • PerCall: Ett nytt InstanceContext (och därmed tjänstobjekt) skapas för varje klientbegäran.

  • PerSession: Ett nytt InstanceContext (och därmed tjänstobjekt) skapas för varje ny klientsession och underhålls under sessionens livslängd (detta kräver en bindning som stöder sessioner).

  • Single: Ett enda InstanceContext (och därmed tjänstobjekt) hanterar alla klientbegäranden under programmets livslängd.

I följande kodexempel visas standardvärdet InstanceContextMode som PerSession uttryckligen anges för en tjänstklass.

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

Och även om ServiceBehaviorAttribute.InstanceContextMode egenskapen styr hur ofta InstanceContext som släpps, OperationBehaviorAttribute.ReleaseInstanceMode styr egenskaperna och ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete när tjänstobjektet släpps.

Välkända Singleton-tjänster

En variant av tjänstobjekt för en enskild instans är ibland användbar: du kan skapa ett tjänstobjekt själv och skapa tjänstvärden med hjälp av det objektet. Om du vill göra det måste du också ange ServiceBehaviorAttribute.InstanceContextMode egenskapen till Single eller så utlöses ett undantag när tjänstvärden öppnas.

ServiceHost(Object, Uri[]) Använd konstruktorn för att skapa en sådan tjänst. Det är ett alternativ till att implementera en anpassad System.ServiceModel.Dispatcher.IInstanceContextInitializer när du vill ange en specifik objektinstans för användning av en singleton-tjänst. Du kan använda den här överbelastningen när din tjänstimplementeringstyp är svår att konstruera (till exempel om den inte implementerar en parameterlös offentlig konstruktor).

Observera att när ett objekt tillhandahålls till den här konstruktorn fungerar vissa funktioner relaterade till WCF-beteendet (Windows Communication Foundation) på ett annat sätt. Anrop InstanceContext.ReleaseServiceInstance har till exempel ingen effekt när en singleton-objektinstans tillhandahålls. På samma sätt ignoreras alla andra instansutgivningsmekanismer. Fungerar ServiceHost alltid som om egenskapen OperationBehaviorAttribute.ReleaseInstanceMode är inställd på ReleaseInstanceMode.None för alla åtgärder.

Dela InstanceContext-objekt

Du kan också styra vilken sessionskänslig kanal eller vilket anrop som är associerat med vilket InstanceContext objekt genom att utföra associationen själv.

Samtidighet

Samtidighet är kontrollen över antalet trådar som är aktiva i en InstanceContext samtidigt. Detta styrs med hjälp ServiceBehaviorAttribute.ConcurrencyMode av med ConcurrencyMode uppräkningen.

Följande tre samtidighetslägen är tillgängliga:

  • Single: Varje instanskontext får ha högst en trådbearbetningsmeddelanden i instanskontexten i taget. Andra trådar som vill använda samma instanskontext måste blockeras tills den ursprungliga tråden avslutar instanskontexten.

  • Multiple: Varje tjänstinstans kan ha flera trådar som bearbetar meddelanden samtidigt. Tjänstimplementeringen måste vara trådsäker för att använda det här samtidighetsläget.

  • Reentrant: Varje tjänstinstans bearbetar ett meddelande i taget, men accepterar återaktiveringsåtgärdsanrop. Tjänsten accepterar endast dessa anrop när den anropar via ett WCF-klientobjekt.

Kommentar

Det kan vara svårt att förstå och utveckla kod som på ett säkert sätt använder mer än en tråd. Kontrollera att tjänsten är korrekt utformad för dessa lägen innan du använder Multiple eller Reentrant värden. Mer information finns i ConcurrencyMode.

Användningen av samtidighet är relaterad till instancing-läget. Vid PerCall instancing är samtidighet inte relevant, eftersom varje meddelande bearbetas av en ny InstanceContext och därför är aldrig mer än en tråd aktiv i InstanceContext.

I följande kodexempel visas hur du anger ConcurrencyMode egenskapen till Multiple.

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

Sessioner interagerar med InstanceContext Inställningar

Sessioner och InstanceContext interagerar beroende på kombinationen av värdet för SessionMode uppräkningen i ett kontrakt och ServiceBehaviorAttribute.InstanceContextMode egenskapen för tjänstimplementeringen, som styr associationen mellan kanaler och specifika tjänstobjekt.

I följande tabell visas resultatet av en inkommande kanal som antingen stöder sessioner eller inte stöder sessioner med tanke på en tjänsts kombination av värdena för ServiceContractAttribute.SessionMode egenskapen och egenskapen ServiceBehaviorAttribute.InstanceContextMode .

InstanceContextMode-värde Required Allowed NotAllowed
PerCall – Beteende med sessionskänslig kanal: En session och InstanceContext för varje anrop.
– Beteende med sessionslös kanal: Ett undantag utlöses.
– Beteende med sessionskänslig kanal: En session och InstanceContext för varje anrop.
– Beteende med sessionslös kanal: En InstanceContext för varje anrop.
– Beteende med sessionskänslig kanal: Ett undantag utlöses.
– Beteende med sessionslös kanal: En InstanceContext för varje anrop.
PerSession – Beteende med sessionskänslig kanal: En session och InstanceContext för varje kanal.
– Beteende med sessionslös kanal: Ett undantag utlöses.
– Beteende med sessionskänslig kanal: En session och InstanceContext för varje kanal.
– Beteende med sessionslös kanal: En InstanceContext för varje anrop.
– Beteende med sessionskänslig kanal: Ett undantag utlöses.
– Beteende med sessionslös kanal: En InstanceContext för varje anrop.
Enstaka – Beteende med sessionskänslig kanal: En session och en InstanceContext för alla anrop.
– Beteende med sessionslös kanal: Ett undantag utlöses.
– Beteende med sessionskänslig kanal: En session och InstanceContext för den skapade eller användardefinierade singletonen.
– Beteende med sessionslös kanal: En InstanceContext för den skapade eller användardefinierade singletonen.
– Beteende med sessionskänslig kanal: Ett undantag utlöses.
– Beteende med sessionslös kanal: En InstanceContext för varje skapad singleton eller för den användardefinierade singletonen.

Se även