Teilen über


Verwenden von Sitzungen

In Windows Communication Foundation (WCF)-Anwendungen korreliert eine Sitzung eine Gruppe von Nachrichten in eine Unterhaltung. WCF-Sitzungen unterscheiden sich von dem Sitzungsobjekt, das in ASP.NET Anwendungen verfügbar ist, unterstützen unterschiedliche Verhaltensweisen und werden auf unterschiedliche Weise gesteuert. In diesem Thema werden die Features beschrieben, die Sitzungen in WCF-Anwendungen aktivieren und wie sie verwendet werden.

Sitzungen in Windows Communication Foundation-Anwendungen

Wenn ein Dienstvertrag angibt, dass eine Sitzung erforderlich ist, muss dieser Vertrag angeben, dass alle Anrufe (d. h. der zugrunde liegende Nachrichtenaustausch, der die Anrufe unterstützt) Teil derselben Unterhaltung sein muss. Wenn ein Vertrag angibt, dass er Sitzungen zulässt, aber keines erfordert, können Clients eine Verbindung herstellen und entweder eine Sitzung herstellen oder keine Sitzung einrichten. Wenn die Sitzung endet und eine Nachricht über denselben Kanal gesendet wird, wird eine Ausnahme ausgelöst.

WCF-Sitzungen weisen die folgenden hauptkonzeptuellen Features auf:

  • Sie werden explizit von der aufrufenden Anwendung (dem WCF-Client) initiiert und beendet.

  • Während einer Sitzung übermittelte Nachrichten werden in der Reihenfolge verarbeitet, in der sie empfangen werden.

  • Sitzungen verknüpfen eine Gruppe von Nachrichten zu einer Unterhaltung. Verschiedene Arten von Korrelation sind möglich. 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. Die Features, die von der Sitzung abgeleitet werden können, hängen von der Art der Korrelation ab.

  • Es gibt keinen allgemeinen Datenspeicher, der einer WCF-Sitzung zugeordnet ist.

Wenn Sie mit der Klasse in ASP.NET Anwendungen und der darin bereitgestellten Funktionalität vertraut sind, stellen Sie möglicherweise die folgenden Unterschiede zwischen dieser Art von Sitzung und WCF-Sitzungen fest:If you are familiar with the System.Web.SessionState.HttpSessionState class in ASP.NET applications and the functionality it provides, you might notice the following differences between that kind of session and WCF sessions:

  • ASP.NET Sitzungen werden immer vom Server initiiert.

  • ASP.NET Sitzungen sind implizit ungeordnet.

  • ASP.NET-Sitzungen stellen einen allgemeinen Datenspeichermechanismus für Anforderungen bereit.

In diesem Thema wird Folgendes beschrieben:

  • Das Standardausführungsverhalten bei Verwendung sitzungsbasierter Bindungen in der Dienstmodell-Ebene.

  • Die Arten von Features, die von den WCF-sitzungsbasierten, systembereitgestellten Bindungen bereitgestellt werden.

  • So erstellen Sie einen Vertrag, der eine Sitzungsanforderung deklariert.

  • So verstehen und steuern Sie die Erstellung und Beendigung der Sitzung sowie deren Beziehung zur Dienstinstanz.

Standardausführungsverhalten mit Sitzungen

Eine Bindung, die versucht, eine Sitzung zu initiieren, wird als sitzungsbasierte Bindung bezeichnet. Serviceverträge geben an, dass sie sitzungsbasierte Bindungen erfordern, zulassen oder ablehnen, indem sie die Eigenschaft auf der ServiceContractAttribute.SessionMode Dienstvertragsschnittstelle (oder Klasse) auf einen der System.ServiceModel.SessionMode Enumerationswerte festlegen. Der Wert dieser Eigenschaft lautet Allowedstandardmäßig, d. h., wenn ein Client eine sitzungsbasierte Bindung mit einer WCF-Dienstimplementierung verwendet, richtet der Dienst die bereitgestellte Sitzung ein und verwendet sie.

Wenn ein WCF-Dienst eine Clientsitzung akzeptiert, sind die folgenden Features standardmäßig aktiviert:

  1. Alle Aufrufe zwischen einem WCF-Clientobjekt werden von derselben Dienstinstanz behandelt.

  2. Andere sitzungsbasierte Bindungen stellen zusätzliche Funktionen bereit.

Vom System bereitgestellte Sitzungstypen

Eine sitzungsbasierte Bindung ermöglicht die Standardzuordnung einer Dienstinstanz mit einer bestimmten Sitzung. Andere sitzungsbasierte Bindungen ermöglichen nicht nur die zuvor beschriebene sitzungsbasierte Instanziierungssteuerung, sondern unterstützen darüber hinaus andere Funktionen.

WCF stellt die folgenden Arten von sitzungsbasiertem Verhalten bereit:

Das Festlegen der SessionMode Eigenschaft gibt nicht den Typ der Sitzung an, die der Vertrag erfordert, nur, dass er einen benötigt.

Erstellen eines Vertrags, der eine Sitzung erfordert

Das Erstellen eines Vertrags, der eine Sitzung erfordert, gibt an, dass die Gruppe von Vorgängen, die der Dienstvertrag deklariert, innerhalb derselben Sitzung ausgeführt werden muss und dass Nachrichten in der Reihenfolge übermittelt werden müssen. Um die Ebene der Sitzungsunterstützung zu bestätigen, die ein Servicevertrag erfordert, legen Sie die ServiceContractAttribute.SessionMode Eigenschaft auf der Dienstvertragsschnittstelle oder -klasse auf den Wert der System.ServiceModel.SessionMode Enumeration fest, um anzugeben, ob der Vertrag:

  • Erfordert eine Sitzung.

  • Ermöglicht es einem Client, eine Sitzung einzurichten.

  • Verbietet eine Sitzung.

Durch Festlegen der SessionMode -Eigenschaft wird allerdings nicht der vom Vertrag angeforderte Typ des sitzungsbasierten Verhaltens angegeben. Es weist WCF an, zur Laufzeit zu bestätigen, ob die konfigurierte Bindung (die den Kommunikationskanal erstellt) für den Dienst eine Sitzung einrichtet, nicht einrichtet oder einrichten kann, wenn ein Dienst implementiert wird. Die Bindung kann diese Anforderung wiederum mit einem beliebigen, von ihr gewählten Typ eines sitzungsbasierten Verhaltens erfüllen – Sicherheit, Transport, Zuverlässigkeit oder eine Kombination daraus. Das genaue Verhalten hängt vom ausgewählten Wert ab System.ServiceModel.SessionMode . Wenn die konfigurierte Bindung des Diensts nicht dem Wert entspricht SessionMode, wird eine Ausnahme ausgelöst. Bindungen und die von ihnen erstellten Kanäle, die Sitzungen unterstützen, werden als sitzungsbasiert bezeichnet.

Der folgende Dienstvertrag gibt an, dass alle Vorgänge in ICalculatorSession innerhalb einer Sitzung ausgetauscht werden müssen. Keine der Vorgänge gibt einen Wert an den Aufrufer zurück, mit Ausnahme der Equals Methode. Equals Die Methode akzeptiert jedoch keine Parameter und kann daher nur einen Wert ungleich Null innerhalb einer Sitzung zurückgeben, in der Daten bereits an die anderen Vorgänge übergeben wurden. Dieser Vertrag erfordert, dass eine Sitzung ordnungsgemäß funktioniert. Ohne eine Sitzung, die einem bestimmten Client zugeordnet ist, kann die Dienstinstanz nicht wissen, welche vorherigen Daten dieser Client gesendet hat.

[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

Wenn ein Dienst eine Sitzung zulässt, wird eine Sitzung eingerichtet und verwendet, wenn der Client eine Sitzung initiiert. andernfalls wird keine Sitzung eingerichtet.

Sitzungen und Dienstinstanzen

Wenn Sie das Standardverhalten der Instancing in WCF verwenden, werden alle Aufrufe zwischen einem WCF-Clientobjekt von derselben Dienstinstanz behandelt. Daher können Sie sich auf Anwendungsebene eine Sitzung vorstellen, indem Sie das Anwendungsverhalten ähnlich dem lokalen Anrufverhalten aktivieren. Wenn Sie beispielsweise ein lokales Objekt erstellen:

  • Ein Konstruktor wird aufgerufen.

  • Alle nachfolgenden Aufrufe an den WCF-Clientobjektverweis werden von derselben Objektinstanz verarbeitet.

  • Ein Destruktor wird aufgerufen, wenn der Objektverweis zerstört wird.

Sitzungen ermöglichen ein ähnliches Verhalten zwischen Clients und Diensten, solange das Standardverhalten der Dienstinstanz verwendet wird. Wenn ein Dienstvertrag Sitzungen erfordert oder unterstützt, kann ein oder mehrere Vertragsvorgänge durch Festlegen der IsInitiating Eigenschaften IsTerminating als Initiieren oder Beenden einer Sitzung gekennzeichnet werden.

Einleitende Vorgänge sind diejenigen, die als erste Vorgänge einer neuen Sitzung aufgerufen werden müssen. Vorgänge, die nicht initialisieren, können nur aufgerufen werden, nachdem mindestens ein initialisierender Vorgang aufgerufen wurde. Sie können daher eine Art Sitzungskonstruktor für Ihren Dienst erstellen, indem Sie initiierende Vorgänge deklarieren, die Eingaben von Clients übernehmen und für den Beginn der Dienstinstanz geeignet sind. (Der Zustand ist der Sitzung zugeordnet, jedoch nicht dem Dienstobjekt.)

Beendigungsvorgängesind dagegen Vorgänge, die als letzte Nachricht in einer vorhandenen Sitzung aufgerufen werden müssen. Im Standardfall verwertet WCF das Dienstobjekt und dessen Kontext erneut, nachdem die Sitzung, mit der der Dienst verknüpft wurde, geschlossen wurde. Sie können folglich eine Art Destruktor erstellen, indem Sie Beendigungsvorgänge deklarieren, die zum Ausführen einer Funktion gedacht sind, die sich für das Ende der Dienstinstanz eignet.

Hinweis

Obwohl das Standardverhalten eine Ähnlichkeit mit lokalen Konstruktoren und Destruktoren aufweist, ist es nur eine Ähnlichkeit. Jeder WCF-Dienstvorgang kann ein initiierender oder beendeter Vorgang sein oder beide gleichzeitig. Darüber hinaus kann im Standardfall das Initiieren von Vorgängen beliebig oft aufgerufen werden. Es werden keine zusätzlichen Sitzungen erstellt, nachdem die Sitzung eingerichtet und einer Instanz zugeordnet ist, es sei denn, Sie steuern explizit die Lebensdauer der Dienstinstanz (durch Bearbeiten des System.ServiceModel.InstanceContext Objekts). Schließlich ist der Zustand der Sitzung und nicht dem Dienstobjekt zugeordnet.

Beispielsweise erfordert der ICalculatorSession im vorherigen Beispiel verwendete Vertrag, dass das WCF-Clientobjekt zuerst den Clear Vorgang vor einem anderen Vorgang aufruft und dass die Sitzung mit diesem WCF-Clientobjekt beendet werden soll, wenn sie den Equals Vorgang aufruft. Das folgende Codebeispiel zeigt einen Vertrag, der diese Anforderungen erzwingt. Clear muss zuerst aufgerufen werden, um eine Sitzung zu initiieren, und diese Sitzung endet, wenn Equals sie aufgerufen wird.

[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

Dienste starten keine Sitzungen mit Clients. In WCF-Clientanwendungen besteht eine direkte Beziehung zwischen der Lebensdauer des sitzungsbasierten Kanals und der Lebensdauer der Sitzung selbst. Aus diesem Grund erstellen Clients neue Sitzungen, indem sie neue sitzungsbasierte Kanäle erstellen, und beenden bestehende Sitzungen, indem sie sitzungsbasierte Kanäle ordnungsgemäß schließen. Ein Client startet eine Sitzung mit einem Dienstendpunkt, indem eine der folgenden Aufrufe ausgeführt wird:

In der Regel beendet ein Client eine Sitzung mit einem Dienstendpunkt, indem einer der folgenden Aufrufe ausgeführt wird:

  • ICommunicationObject.Close auf dem Kanal, das durch einen Aufruf an ChannelFactory<TChannel>.CreateChannelzurückgegeben wurde.

  • ClientBase<TChannel>.Close auf dem von Svcutil.exegenerierten WCF-Clientobjekt.

  • Ein Beendigungsvorgang für einen der WCF-Clientobjekttypen (standardmäßig werden keine Vorgänge beendet; der Vertrag muss explizit einen Beendigungsvorgang angeben). Wenn der erste Vorgang aufgerufen wird, öffnet das WCF-Clientobjekt automatisch den Kanal und initiiert eine Sitzung.

Beispiele finden Sie unter How to: Create a Service That Requires Sessions sowie die Beispiele zu Default Service Behavior und Instancing.

Weitere Informationen zu Clients und Sitzungen finden Sie unter "Zugreifen auf Dienste mithilfe eines WCF-Clients".

Sitzungen interagieren mit InstanceContext-Einstellungen

Es gibt eine Interaktion zwischen der SessionMode Enumeration in einem Vertrag und der ServiceBehaviorAttribute.InstanceContextMode Eigenschaft, die die Zuordnung zwischen Kanälen und bestimmten Dienstobjekten steuert. Weitere Informationen finden Sie unter Sitzungen, Instanzierung und Gleichzeitigkeit.

Freigeben von InstanceContext-Objekten

Sie können außerdem steuern, welcher sitzungsbasierte Kanal oder Anruf mit welchem InstanceContext Objekt verknüpft wird, indem Sie die Zuordnung selbst vornehmen.

Sitzungen und Streaming

Wenn Sie eine große Menge an Daten übertragen müssen, ist der Streamingübertragungsmodus in WCF eine machbare Alternative zum Standardverhalten der Pufferung und Verarbeitung von Nachrichten im Arbeitsspeicher in ihrer Gesamtheit. Möglicherweise tritt beim Streaming von Aufrufen mit einer sitzungsbasierten Bindung ein unerwartetes Verhalten auf. Alle Streaminganrufe werden über einen einzelnen Kanal (den Datagrammkanal) getätigt, der Sitzungen nicht unterstützt, auch wenn die verwendete Bindung für die Verwendung von Sitzungen konfiguriert ist. Wenn mehrere Clients Streamingaufrufe an dasselbe Dienstobjekt über eine sitzungsbasierte Bindung tätigen und der Parallelitätsmodus des Dienstobjekts auf einen einzelnen Modus und der Instanzkontextmodus auf PerSession festgelegt ist, müssen alle Aufrufe den Datagrammkanal durchlaufen, sodass jeweils nur ein Aufruf verarbeitet wird. Bei einem oder mehreren Clients kommt es dabei unter Umständen zu einem Timeout. Sie können dieses Problem umgehen, indem Sie entweder den Instanzkontextmodus (InstanceContextMode) des Dienstobjekts auf PerCall oder die Parallelität auf „multiple“ festlegen.

Hinweis

MaxConcurrentSessions hat in diesem Fall keine Auswirkung, da nur eine "Sitzung" verfügbar ist.

Siehe auch