Delen via


Sessies, instancing en gelijktijdigheid

Een sessie is een correlatie van alle berichten die tussen twee eindpunten worden verzonden. Instancing verwijst naar het beheren van de levensduur van door de gebruiker gedefinieerde serviceobjecten en de bijbehorende InstanceContext objecten. Gelijktijdigheid is de term die wordt gegeven aan het beheer van het aantal threads dat tegelijkertijd wordt InstanceContext uitgevoerd.

In dit onderwerp worden deze instellingen beschreven, hoe u deze kunt gebruiken en de verschillende interacties tussen deze instellingen.

Sessies

Wanneer een servicecontract de ServiceContractAttribute.SessionMode eigenschap SessionMode.Requiredinstelt, wordt in dat contract gezegd dat alle oproepen (dat wil zeggen de onderliggende berichtenuitwisselingen die ondersteuning bieden voor de oproepen) deel moeten uitmaken van hetzelfde gesprek. Als een contract aangeeft dat sessies zijn toegestaan, maar geen sessie vereist, kunnen clients verbinding maken en een sessie tot stand brengen of niet. Als de sessie eindigt en een bericht via hetzelfde sessiekanaal wordt verzonden, wordt er een uitzondering gegenereerd.

WCF-sessies hebben de volgende belangrijke conceptuele functies:

  • Ze worden expliciet geïnitieerd en beëindigd door de aanroepende toepassing.

  • Berichten die tijdens een sessie worden bezorgd, worden verwerkt in de volgorde waarin ze worden ontvangen.

  • Sessies correleren een groep berichten in een gesprek. De betekenis van die correlatie is een abstractie. Eén sessiegebaseerd kanaal kan bijvoorbeeld berichten correleren op basis van een gedeelde netwerkverbinding, terwijl een ander sessiekanaal berichten kan correleren op basis van een gedeelde tag in de berichttekst. De functies die kunnen worden afgeleid van de sessie, zijn afhankelijk van de aard van de correlatie.

  • Er is geen algemeen gegevensarchief gekoppeld aan een WCF-sessie.

Als u bekend bent met de System.Web.SessionState.HttpSessionState klasse in ASP.NET toepassingen en de functionaliteit die deze biedt, ziet u mogelijk de volgende verschillen tussen dat soort sessies en WCF-sessies:

  • ASP.NET sessies worden altijd door de server geïnitieerd.

  • ASP.NET sessies impliciet ongeordeerd zijn.

  • ASP.NET sessies bieden een algemeen mechanisme voor gegevensopslag voor aanvragen.

Clienttoepassingen en servicetoepassingen communiceren op verschillende manieren met sessies. Clienttoepassingen starten sessies en ontvangen en verwerken de berichten die in de sessie worden verzonden. Servicetoepassingen kunnen sessies gebruiken als uitbreidbaarheidspunt om extra gedrag toe te voegen. Dit wordt gedaan door rechtstreeks met de contextprovider van een InstanceContext aangepast exemplaar te werken of te implementeren.

Instantiëren

Het gedrag van de instancing (ingesteld met behulp van de ServiceBehaviorAttribute.InstanceContextMode eigenschap) bepaalt hoe het InstanceContext wordt gemaakt als reactie op binnenkomende berichten. Standaard is elk InstanceContext gekoppeld aan één door de gebruiker gedefinieerd serviceobject, dus (in het standaardscenario) bepaalt het instellen van de InstanceContextMode eigenschap ook de instancing van door de gebruiker gedefinieerde serviceobjecten. De InstanceContextMode opsomming definieert de instancingmodi.

De volgende instancingmodi zijn beschikbaar:

  • PerCall: Er wordt een nieuw InstanceContext (en daarom serviceobject) gemaakt voor elke clientaanvraag.

  • PerSession: Er wordt een nieuw InstanceContext (en daarom serviceobject) gemaakt voor elke nieuwe clientsessie en onderhouden voor de levensduur van die sessie (hiervoor is een binding vereist die sessies ondersteunt).

  • Single: Eén InstanceContext (en daarom serviceobject) verwerkt alle clientaanvragen voor de levensduur van de toepassing.

In het volgende codevoorbeeld ziet u de standaardwaarde InstanceContextMode die PerSession expliciet wordt ingesteld op een serviceklasse.

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

En terwijl de ServiceBehaviorAttribute.InstanceContextMode eigenschap bepaalt hoe vaak de InstanceContext vrijgegeven, de OperationBehaviorAttribute.ReleaseInstanceMode en ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete eigenschappen bepalen wanneer het serviceobject wordt vrijgegeven.

Bekende Singleton Services

Een variatie op serviceobjecten met één exemplaar is soms handig: u kunt zelf een serviceobject maken en de servicehost maken met behulp van dat object. Hiervoor moet u ook de ServiceBehaviorAttribute.InstanceContextMode eigenschap Single instellen op of een uitzondering wordt gegenereerd wanneer de servicehost wordt geopend.

Gebruik de ServiceHost(Object, Uri[]) constructor om een dergelijke service te maken. Het biedt een alternatief voor het implementeren van een aangepast exemplaar wanneer u een specifiek objectexemplaren System.ServiceModel.Dispatcher.IInstanceContextInitializer wilt opgeven voor gebruik door een singleton-service. U kunt deze overbelasting gebruiken wanneer uw serviceimplementatietype moeilijk te bouwen is (bijvoorbeeld als er geen openbare constructor zonder parameter wordt geïmplementeerd).

Houd er rekening mee dat wanneer een object aan deze constructor wordt verstrekt, sommige functies met betrekking tot het gedrag van Windows Communication Foundation (WCF) anders werken. Het aanroepen InstanceContext.ReleaseServiceInstance heeft bijvoorbeeld geen effect wanneer er een exemplaar van een singleton-object wordt opgegeven. Op dezelfde manier wordt elk ander mechanisme voor het vrijgeven van exemplaren genegeerd. De ServiceHost eigenschap gedraagt zich altijd alsof de OperationBehaviorAttribute.ReleaseInstanceMode eigenschap is ingesteld ReleaseInstanceMode.None op alle bewerkingen.

InstanceContext-objecten delen

U kunt ook bepalen welk sessionful kanaal of aanroep is gekoppeld aan welk InstanceContext object door die koppeling zelf uit te voeren.

Gelijktijdigheid

Gelijktijdigheid is het beheer van het aantal threads dat tegelijk actief is in een InstanceContext thread. Dit wordt bepaald door gebruik te maken van de ServiceBehaviorAttribute.ConcurrencyModeConcurrencyMode opsomming.

De volgende drie gelijktijdigheidsmodi zijn beschikbaar:

  • Single: Elke instantiecontext mag maximaal één thread tegelijk berichten verwerken in de instantiecontext. Andere threads die dezelfde exemplaarcontext willen gebruiken, moeten worden geblokkeerd totdat de oorspronkelijke thread de exemplaarcontext afsluit.

  • Multiple: Elk service-exemplaar kan meerdere threads hebben die berichten gelijktijdig verwerken. De service-implementatie moet thread-safe zijn om deze gelijktijdigheidsmodus te kunnen gebruiken.

  • Reentrant: Elk service-exemplaar verwerkt één bericht tegelijk, maar accepteert aanroepen voor opnieuw inschrijvende bewerkingen. De service accepteert deze aanroepen alleen wanneer deze wordt aangeroepen via een WCF-clientobject.

Notitie

Het kan lastig zijn om code te begrijpen en te ontwikkelen die veilig meer dan één thread gebruikt. Voordat u Multiple deze gebruikt of Reentrant waarden gebruikt, moet u ervoor zorgen dat uw service goed is ontworpen voor deze modi. Zie ConcurrencyMode voor meer informatie.

Het gebruik van gelijktijdigheid is gerelateerd aan de modus voor instancing. Instancing PerCall is gelijktijdigheid niet relevant, omdat elk bericht wordt verwerkt door een nieuw InstanceContext en daarom nooit meer dan één thread actief is in de InstanceContext.

In het volgende codevoorbeeld ziet u hoe u de ConcurrencyMode eigenschap instelt op Multiple.

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

Sessies communiceren met InstanceContext Instellingen

Sessies en InstanceContext interactie, afhankelijk van de combinatie van de waarde van de SessionMode opsomming in een contract en de ServiceBehaviorAttribute.InstanceContextMode eigenschap van de service-implementatie, waarmee de koppeling tussen kanalen en specifieke serviceobjecten wordt bepaald.

In de volgende tabel ziet u het resultaat van een binnenkomend kanaal, ofwel ondersteunende sessies of geen ondersteunende sessies op basis van de combinatie van de waarden van de ServiceContractAttribute.SessionMode eigenschap en de eigenschap van een ServiceBehaviorAttribute.InstanceContextMode service.

InstanceContextMode-waarde Required Allowed NotAllowed
PerCall - Gedrag met sessionful kanaal: een sessie en InstanceContext voor elke oproep.
- Gedrag met sessieloos kanaal: er wordt een uitzondering gegenereerd.
- Gedrag met sessionful kanaal: een sessie en InstanceContext voor elke oproep.
- Gedrag met sessieloos kanaal: Een InstanceContext voor elke oproep.
- Gedrag met sessionful kanaal: er wordt een uitzondering gegenereerd.
- Gedrag met sessieloos kanaal: Een InstanceContext voor elke oproep.
Persessie - Gedrag met sessionful kanaal: een sessie en InstanceContext voor elk kanaal.
- Gedrag met sessieloos kanaal: er wordt een uitzondering gegenereerd.
- Gedrag met sessionful kanaal: een sessie en InstanceContext voor elk kanaal.
- Gedrag met sessieloos kanaal: Een InstanceContext voor elke oproep.
- Gedrag met sessionful kanaal: er wordt een uitzondering gegenereerd.
- Gedrag met sessieloos kanaal: Een InstanceContext voor elke oproep.
Eén - Gedrag met sessievol kanaal: een sessie en één InstanceContext voor alle oproepen.
- Gedrag met sessieloos kanaal: er wordt een uitzondering gegenereerd.
- Gedrag met sessionful-kanaal: een sessie en InstanceContext voor de gemaakte of door de gebruiker opgegeven singleton.
- Gedrag met sessieloos kanaal: Een InstanceContext voor de gemaakte of door de gebruiker opgegeven singleton.
- Gedrag met sessionful kanaal: er wordt een uitzondering gegenereerd.
- Gedrag met sessieloos kanaal: Een InstanceContext voor elke gemaakte singleton of voor de door de gebruiker opgegeven singleton.

Zie ook