Warum verhält sich InstanceContextMode.PerSession wie PerCall bei Verwendung von wsHttpBinding?

8

Ich habe WCF-Dienst von AJAX-Client mit SOAP 1.2 verbraucht

Web.config:

%Vor%

Von dem, was ich gelesen habe, muss ich Verwenden Sie <security mode="None"/> , da ein mit der Bindung "wsHttpBinding" verfügbarer Dienst WS-Security der WS-* -Familie der Webdienstspezifikationen implementiert. Da die Bindung Sicherheit verwendet, wird die Anforderung zurückgewiesen, da AJAX den Sicherheitskontext nicht unterstützt.

Mein WCF-Dienstverhalten ist mit InstanceContextMode.PerSession definiert:

%Vor%

Aber wenn ich es konsumiere, verhält sich der Dienst wie PerCall und jeder Aufruf startet eine neue WCF-Instanz anstelle der aktuellen Instanz.

Warum verhält sich InstanceContextMode.PerSession bei Verwendung von wsHttpBinding wie PerCall?

Was kann ich tun?

    
Dor Cohen 06.12.2012, 14:52
quelle

2 Antworten

3

Sitzungen werden bei Verwendung über HTTP nur von WCF unterstützt, wenn Sicherheitssitzungen oder zuverlässige Sitzungen verwendet werden. Wenn Sie beide nicht verwenden können, müssen Sie selbst einen Sitzungsmechanismus implementieren. Wenn Sie sowohl die Client- als auch die Server-Seite steuern, wäre das ganz einfach. Hier ist wie:

Erstellen Sie eine Klasse, die alle Sitzungsdaten enthält, die Sie gespeichert haben müssen (nennen wir sie SessionData ), plus eine zusätzliche DateTime für die letzte Verwendung der Sitzung. Fügen Sie dann Ihrer Serviceklasse (oder einer anderen Klasse) ein static ConcurrentDictionary<string, SessionData> hinzu.

Wenn ein Client einen Anruf an Ihren Dienst sendet, müssen Sie eine eindeutige Zeichenfolge übergeben, die die Sitzung identifiziert (sie kann auf der Clientseite nach dem Zufallsprinzip generiert werden). Wenn ein Client einen Dienst aufruft, suchen Sie die Sitzungszeichenfolge im Wörterbuch und rufen Sie die Sitzungsdaten ab (und aktualisieren Sie den Inhalt nach Bedarf). Wenn es nicht existiert, erstellen Sie einen neuen Eintrag im Wörterbuch. Jedes Mal, wenn Sie auf das Objekt SessionData zugreifen, aktualisieren Sie das zuletzt verwendete DateTime auf die aktuelle Zeit. Eine Hintergrundaufgabe sollte in regelmäßigen Abständen alte Sitzungen löschen, die längere Zeit nicht verwendet wurden.

Das ist es - Sie haben selbst Sitzungen implementiert. Sie können nun InstanceContextMode.Single verwenden und sich keine Sorgen darüber machen, dass WCF Instanzen Ihrer Serviceklasse pro Sitzung korrekt erstellt.

BEARBEITEN : Wenn Sie Ihren WCF-Dienst mit .NET 4.5 schreiben und Ihre Webanwendung nur auf moderne Browser abzielt, können Sie auf der Serverseite NetHttpBinding und auf der Clientseite WebSocket verwenden. NetHttpBinding unterstützt Sitzung (wenn SessionMode.Required angegeben wird).

    
Allon Guralnek 09.12.2012, 16:29
quelle
0

Dieser Link gibt Ihnen so ziemlich alles, was Sie brauchen darüber zu wissen (im Allgemeinen natürlich).

Aber um genau zu sein. Msdn sagt über die WCF-Sitzung:

  

Sie werden explizit vom Aufrufer initiiert und beendet   Anwendung

Ich muss sagen, dass ich nichts über JS-Code / Framework weiß, mit dem Sie explizit geöffneten WCF-Kommunikationskanal speichern können, um Ihre "Session" am Leben zu erhalten. (Sie haben Ihren Kundencode nicht angegeben, so dass ich einige Annahmen machen muss). WCF-Sitzung ist nicht "Cookie-basiert". Es funktioniert nicht "out of the box" von Ihrem Browser wie es für ASP.NET-Webanwendung wäre.

Durch die Einstellung von InstanceContextMode.PerSession wird Ihr WCF-Dienst "sitzungsbereit", aber es reicht nicht aus, eine Sitzung zu erzwingen.

    
Grzegorz W 09.12.2012 16:52
quelle