Sitzungen, Instanziierung und ParallelitätSessions, Instancing, and Concurrency

Eine Sitzung ist die Korrelation (d. h. die Beziehung) aller zwischen zwei Endpunkten gesendeter Nachrichten.A session is a correlation of all messages sent between two endpoints. Instanziierung bezieht sich auf die Steuerung der Lebensdauer von benutzerdefinierten Dienstobjekten und den zugehörigen InstanceContext -Objekten.Instancing refers to controlling the lifetime of user-defined service objects and their related InstanceContext objects. Parallelität bezeichnet die Kontrolle der Anzahl von Threads, die gleichzeitig in einem InstanceContext ausgeführt werden.Concurrency is the term given to the control of the number of threads executing in an InstanceContext at the same time.

In diesem Thema werden diese Einstellungen, ihre Verwendung und die Interaktion zwischen den Einstellungen beschrieben.This topic describes these settings, how to use them, and the various interactions between them.

SitzungenSessions

Wenn die ServiceContractAttribute.SessionMode-Eigenschaft durch einen Dienstvertrag auf SessionMode.Required festgelegt wird, bedeutet dies, dass alle Aufrufe (das heißt der zugrunde liegende Nachrichtenaustausch, durch den die Aufrufe unterstützt werden) Teil derselben Konversation sein müssen.When a service contract sets the ServiceContractAttribute.SessionMode property to SessionMode.Required, that contract is saying that all calls (that is, the underlying message exchanges that support the calls) must be part of the same conversation. Falls in einem Vertrag angegeben wird, dass Sitzungen zwar erlaubt, aber nicht erforderlich sind, können Clients eine Verbindung herstellen und eine Sitzung aufbauen oder auch nicht.If a contract specifies that it allows sessions but does not require one, clients can connect and either establish a session or not. Wird eine Sitzung beendet und eine Nachricht über diesen sitzungsbasierten Kanal gesendet, wird eine Ausnahme ausgelöst.If the session ends and a message is sent over the same session-based channel an exception is thrown.

WCF-Sitzungen besitzen die folgenden Hauptkonzepte:WCF sessions have the following main conceptual features:

  • Sie werden explizit von der aufrufenden Anwendung initiiert und beendet.They are explicitly initiated and terminated by the calling application.

  • Die während einer Sitzung gesendeten Nachrichten werden in der Reihenfolge verarbeitet, in der sie empfangen wurden.Messages delivered during a session are processed in the order in which they are received.

  • Durch Sitzungen wird eine Gruppe von Nachrichten zu einer Konversation zusammengefasst.Sessions correlate a group of messages into a conversation. Diese Korrelation ist jedoch abstrakt.The meaning of that correlation is an abstraction. So werden zum Beispiel bei einem sitzungsbasierten Kanal Nachrichten auf Grundlage einer gemeinsamen Netzwerkverbindung zueinander in Beziehung gesetzt, bei einem anderen Kanal geschieht dies wiederum auf Grundlage eines gemeinsamen Tags im Nachrichtentext.For instance, one session-based channel may correlate messages based on a shared network connection while another session-based channel may correlate messages based on a shared tag in the message body. Die Funktionen, die von der Sitzung abgeleitet werden können, sind abhängig von der Art der Korrelation.The features that can be derived from the session depend on the nature of the correlation.

  • Es ist kein allgemeiner Datenspeicher einer WCF-Sitzung zugeordnet.There is no general data store associated with a WCF session.

Wenn Sie kennen die System.Web.SessionState.HttpSessionState -Klasse im ASP.NETASP.NET Anwendungen und die Funktionalität bereitstellt, fallen Ihnen möglicherweise die folgenden Unterschiede zwischen dieser Art von Sitzung und WCF-Sitzungen:If you are familiar with the System.Web.SessionState.HttpSessionState class in ASP.NETASP.NET applications and the functionality it provides, you might notice the following differences between that kind of session and WCF sessions:

  • ASP.NETASP.NET -Sitzungen werden immer vom Server initiiert. sessions are always server-initiated.

  • ASP.NETASP.NET -Sitzungen sind implizit nicht sortiert. sessions are implicitly unordered.

  • ASP.NETASP.NET -Sitzungen stellen einen allgemeinen Datenspeicher für Anforderungen bereit. sessions provide a general data storage mechanism across requests.

Client- und Dienstanwendungen interagieren auf unterschiedliche Weise mit Sitzungen.Client applications and service applications interact with sessions in different ways. Clientanwendungen initiieren Sitzungen und empfangen und verarbeiten dann die innerhalb der Sitzung gesendeten Nachrichten.Client applications initiate sessions and then receive and process the messages sent within the session. Dienstanwendungen können Sitzungen als Erweiterungspunkt verwenden, um zusätzliches Verhalten hinzuzufügen.Service applications can use sessions as an extensibility point to add additional behavior. Dies geschieht durch direkte Nutzung von InstanceContext oder durch Implementierung eines benutzerspezifischen Instanzenkontextanbieters.This is done by working directly with the InstanceContext or implementing a custom instance context provider.

InstanziierungInstancing

Durch das Instanziierungsverhalten (das über die ServiceBehaviorAttribute.InstanceContextMode-Eigenschaft festgelegt wird) lässt sich steuern, wie der InstanceContext als Antwort auf eingehende Nachrichten erstellt wird.The instancing behavior (set by using the ServiceBehaviorAttribute.InstanceContextMode property) controls how the InstanceContext is created in response to incoming messages. Standardmäßig ist jeder InstanceContext einem benutzerdefinierten Dienstobjekt zugeordnet. Dies bedeutet, dass (im Normalfall) auch die Instanziierung benutzerdefinierter Dienstobjekte über die InstanceContextMode -Eigenschaft gesteuert wird.By default, each InstanceContext is associated with one user-defined service object, so (in the default case) setting the InstanceContextMode property also controls the instancing of user-defined service objects. Die InstanceContextMode -Enumeration definiert die Instanziierungsmodi.The InstanceContextMode enumeration defines the instancing modes.

Es stehen die folgenden Instanziierungsmodi zur Verfügung:The following instancing modes are available:

  • PerCall: Für jede Clientanforderung wird ein neuer InstanceContext (und damit auch ein neues Dienstobjekt) erstellt.PerCall: A new InstanceContext (and therefore service object) is created for each client request.

  • PerSession: Für jede neue Clientsitzung wird ein neuer InstanceContext (und damit auch ein neues Dienstobjekt) erstellt und für die Lebensdauer dieser Sitzung aufrechterhalten, wofür eine Bindung erforderlich ist, die Sitzungen unterstützt.PerSession: A new InstanceContext (and therefore service object) is created for each new client session and maintained for the lifetime of that session (this requires a binding that supports sessions).

  • Single: Alle Clientanforderungen werden während der Lebensdauer der Anwendung von einem InstanceContext (und damit einem Dienstobjekt) verarbeitet.Single: A single InstanceContext (and therefore service object) handles all client requests for the lifetime of the application.

Das folgende Codebeispiel zeigt den Standard- InstanceContextMode -Wert ( PerSession ), der explizit für eine Dienstklasse festgelegt wird.The following code example shows the default InstanceContextMode value, PerSession being explicitly set on a service class.

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

Durch die ServiceBehaviorAttribute.InstanceContextMode-Eigenschaft wird gesteuert, wie oft der InstanceContext freigegeben wird. Die OperationBehaviorAttribute.ReleaseInstanceMode-Eigenschaft und die ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete-Eigenschaft bestimmen dagegen, wann das Dienstobjekt freigegeben wird.And while the ServiceBehaviorAttribute.InstanceContextMode property controls how often the InstanceContext is released, the OperationBehaviorAttribute.ReleaseInstanceMode and ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete properties control when the service object is released.

Bekannte Singleton-DiensteWell-Known Singleton Services

Gelegentlich ist eine Variante für einzelne Instanzendienstobjekte nützlich: Sie können selbst ein Dienstobjekt und den Diensthost, der dieses Objekt verwendet, erstellen.One variation on single instance service objects is sometimes useful: you can create a service object yourself and create the service host using that object. Hierfür müssen Sie auch die ServiceBehaviorAttribute.InstanceContextMode-Eigenschaft auf Single festlegen, damit keine Ausnahme ausgelöst wird, sobald der Diensthost geöffnet wird.To do so, you must also set the ServiceBehaviorAttribute.InstanceContextMode property to Single or an exception is thrown when the service host is opened.

Verwenden Sie zum Erstellen eines solchen Diensts den ServiceHost.ServiceHost(Object, Uri[])-Konstruktor.Use the ServiceHost.ServiceHost(Object, Uri[]) constructor to create such a service. Dieser stellt eine Alternative zur Implementierung eines benutzerdefinierten System.ServiceModel.Dispatcher.IInstanceContextInitializer dar, wenn Sie eine bestimmte Objektinstanz für einen Singleton-Dienst bereitstellen möchten.It provides an alternative to implementing a custom System.ServiceModel.Dispatcher.IInstanceContextInitializer when you wish to provide a specific object instance for use by a singleton service. Sie können diese Alternative verwenden, wenn Ihr Dienstimplementierungstyp schwer zu erstellen ist (wenn er z. B. keinen öffentlichen parameterlosen Standardkonstruktor implementiert).You can use this overload when your service implementation type is difficult to construct (for example, if it does not implement a default parameterless public constructor).

Beachten Sie, dass wenn ein Objekt für diesen Konstruktor bereitgestellt wird, einige Funktionen in Bezug auf die Windows Communication Foundation (WCF) Instanziierungsverhaltens unterschiedlich funktionieren.Note that when an object is provided to this constructor, some features related to the Windows Communication Foundation (WCF) instancing behavior work differently. So zeigt zum Beispiel der Aufruf von InstanceContext.ReleaseServiceInstance keine Wirkung, wenn eine Singleton-Objektinstanz bereitgestellt wird.For example, calling InstanceContext.ReleaseServiceInstance has no effect when a singleton object instance is provided. Dementsprechend werden auch alle anderen Instanzfreigabemechanismen ignoriert.Similarly, any other instance-release mechanism is ignored. Der ServiceHost verhält sich immer so, als ob die OperationBehaviorAttribute.ReleaseInstanceMode-Eigenschaft für alle Vorgänge auf ReleaseInstanceMode.None festgelegt ist.The ServiceHost always behaves as if the OperationBehaviorAttribute.ReleaseInstanceMode property is set to ReleaseInstanceMode.None for all operations.

Freigeben von InstanceContext-ObjektenSharing InstanceContext Objects

Sie können auch steuern, welcher sitzungsbasierte Kanal oder Aufruf dem InstanceContext -Objekt zugeordnet wird, indem Sie diese Zuordnung selbst vornehmen.You can also control which sessionful channel or call is associated with which InstanceContext object by performing that association yourself.

ParallelitätConcurrency

Bei der Parallelität handelt es sich um die Steuerung der Anzahl von Threads, die gleichzeitig in einem InstanceContext aktiv sind.Concurrency is the control of the number of threads active in an InstanceContext at any one time. Sie können diese Anzahl über ServiceBehaviorAttribute.ConcurrencyMode in Verbindung mit der ConcurrencyMode-Enumeration bestimmen.This is controlled by using the ServiceBehaviorAttribute.ConcurrencyMode with the ConcurrencyMode enumeration.

Es stehen die folgenden drei Parallelitätsmodi zur Verfügung:The following three concurrency modes are available:

  • Single: Jeder Instanzkontext darf höchstens über jeweils einen Thread verfügen, der im Instanzkontext Nachrichten verarbeitet.Single: Each instance context is allowed to have a maximum of one thread processing messages in the instance context at a time. Falls weitere Threads diesen Instanzkontext verwenden möchten, werden sie so lange blockiert, bis der ursprüngliche Thread den Instanzkontext verlässt.Other threads wishing to use the same instance context must block until the original thread exits the instance context.

  • Multiple: Jede Dienstinstanz kann über mehrere Threads verfügen, die Nachrichten gleichzeitig verarbeiten.Multiple: Each service instance can have multiple threads processing messages concurrently. Für diesen Parallelitätsmodus muss die Dienstimplementierung threadsicher sein.The service implementation must be thread-safe to use this concurrency mode.

  • Reentrant: Jede Dienstinstanz verarbeitet jeweils nur eine Nachricht, akzeptiert jedoch eintrittsinvariante Aufrufe.Reentrant: Each service instance processes one message at a time, but accepts re-entrant operation calls. Der Dienst akzeptiert diese Aufrufe nur, wenn sie einen WCF-Clientobjekts über Aufruf.The service only accepts these calls when it is calling out through a WCF client object.

Hinweis

Das Schreiben von Code, bei dem problemlos mehr als ein Thread verwendet wird, kann sich als sehr schwierig erweisen.Understanding and developing code that safely uses more than one thread can be difficult to write successfully. Stellen Sie sicher, dass Ihr Dienst ordnungsgemäß mit den Modi Multiple bzw. Reentrant arbeiten kann, bevor Sie diese Werte verwenden.Before using Multiple or Reentrant values, ensure that your service is properly designed for these modes. Weitere Informationen finden Sie unter ConcurrencyMode.For more information, see ConcurrencyMode.

Die Parallelität steht mit dem Instanziierungsmodus in Beziehung.The use of concurrency is related to the instancing mode. In PerCall Instanziierung ist Parallelität ist nicht relevant, da die Verarbeitung jeder Meldung von einem neuen InstanceContext und daher nie mehr als einem Thread in aktiv ist die InstanceContext.In PerCall instancing, concurrency is not relevant, because each message is processed by a new InstanceContext and, therefore, never more than one thread is active in the InstanceContext.

Das folgende Codebeispiel zeigt, wie die ConcurrencyMode -Eigenschaft auf den Wert Multiplefestgelegt wird.The following code example demonstrates setting the ConcurrencyMode property to Multiple.

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

Interaktion von Sitzungen und InstanceContext-EinstellungenSessions Interact with InstanceContext Settings

Sitzungen und der InstanceContext interagieren je nach Kombination des Werts der SessionMode-Enumeration in einem Vertrag und der ServiceBehaviorAttribute.InstanceContextMode-Eigenschaft der Dienstimplementierung, durch die die Zuordnung zwischen Kanälen und bestimmten Dienstobjekten gesteuert wird.Sessions and InstanceContext interact depending upon the combination of the value of the SessionMode enumeration in a contract and the ServiceBehaviorAttribute.InstanceContextMode property on the service implementation, which controls the association between channels and specific service objects.

Die folgende Tabelle enthält eine Übersicht über die Ergebnisse eines eingehenden Kanals, der Sitzungen je nach Kombination der Werte für die ServiceContractAttribute.SessionMode-Eigenschaft und die ServiceBehaviorAttribute.InstanceContextMode-Eigenschaft eines Diensts unterstützt oder nicht unterstützt.The following table shows the result of an incoming channel either supporting sessions or not supporting sessions given a service's combination of the values of the ServiceContractAttribute.SessionMode property and the ServiceBehaviorAttribute.InstanceContextMode property.

InstanceContextMode-WertInstanceContextMode value Required Allowed NotAllowed
PerCallPerCall -Verhalten bei sitzungsbasiertem Kanal: eine Sitzung und InstanceContext für jeden Aufruf.- Behavior with sessionful channel: A session and InstanceContext for each call.
-Verhalten bei nicht sitzungsbasiertem Kanal: eine Ausnahme ausgelöst.- Behavior with sessionless channel: An exception is thrown.
-Verhalten bei sitzungsbasiertem Kanal: eine Sitzung und InstanceContext für jeden Aufruf.- Behavior with sessionful channel: A session and InstanceContext for each call.
-Verhalten bei nicht sitzungsbasiertem Kanal: eine InstanceContext für jeden Aufruf.- Behavior with sessionless channel: An InstanceContext for each call.
-Verhalten bei sitzungsbasiertem Kanal: eine Ausnahme ausgelöst.- Behavior with sessionful channel: An exception is thrown.
-Verhalten bei nicht sitzungsbasiertem Kanal: eine InstanceContext für jeden Aufruf.- Behavior with sessionless channel: An InstanceContext for each call.
PerSessionPerSession -Verhalten bei sitzungsbasiertem Kanal: eine Sitzung und InstanceContext für jeden Kanal.- Behavior with sessionful channel: A session and InstanceContext for each channel.
-Verhalten bei nicht sitzungsbasiertem Kanal: eine Ausnahme ausgelöst.- Behavior with sessionless channel: An exception is thrown.
-Verhalten bei sitzungsbasiertem Kanal: eine Sitzung und InstanceContext für jeden Kanal.- Behavior with sessionful channel: A session and InstanceContext for each channel.
-Verhalten bei nicht sitzungsbasiertem Kanal: eine InstanceContext für jeden Aufruf.- Behavior with sessionless channel: An InstanceContext for each call.
-Verhalten bei sitzungsbasiertem Kanal: eine Ausnahme ausgelöst.- Behavior with sessionful channel: An exception is thrown.
-Verhalten bei nicht sitzungsbasiertem Kanal: eine InstanceContext für jeden Aufruf.- Behavior with sessionless channel: An InstanceContext for each call.
SingleSingle -Verhalten bei sitzungsbasiertem Kanal: eine Sitzung und ein InstanceContext für alle Aufrufe.- Behavior with sessionful channel: A session and one InstanceContext for all calls.
-Verhalten bei nicht sitzungsbasiertem Kanal: eine Ausnahme ausgelöst.- Behavior with sessionless channel: An exception is thrown.
-Verhalten bei sitzungsbasiertem Kanal: eine Sitzung und InstanceContext für den erstellten bzw. den vom Benutzer angegebenen Singleton.- Behavior with sessionful channel: A session and InstanceContext for the created or user-specified singleton.
-Verhalten bei nicht sitzungsbasiertem Kanal: eine InstanceContext für den erstellten bzw. den vom Benutzer angegebenen Singleton.- Behavior with sessionless channel: An InstanceContext for the created or user-specified singleton.
-Verhalten bei sitzungsbasiertem Kanal: eine Ausnahme ausgelöst.- Behavior with sessionful channel: An exception is thrown.
-Verhalten bei nicht sitzungsbasiertem Kanal: eine InstanceContext für jeden erstellten Singleton oder für den vom Benutzer angegebenen Singleton.- Behavior with sessionless channel: An InstanceContext for each created singleton or for the user-specified singleton.

Siehe auchSee Also

Verwenden von SitzungenUsing Sessions
Vorgehensweise: Erstellen eines Diensts, der Sitzungen erfordertHow to: Create a Service That Requires Sessions
Vorgehensweise: Steuern der DienstinstanzerstellungHow to: Control Service Instancing
ParallelitätConcurrency
InstanziierungInstancing
SitzungSession