2010-05-26 19 views
29

Die Dokumentation zu diesem Thema ist schlecht. Ich verwende WCF-Dienste mit NetTcpBinding, das im Windows-Dienst gehostet wird. Das Problem ist, dass eine Sitzung gelöscht wird, wenn sie für einige Zeit inaktiv ist. Was ich brauche, ist die Sitzung, die immer am Leben ist. Ist WCF zuverlässige Sitzung etwas, das helfen kann? Oder kann ich nur mit Timeout-Einstellungen spielen?Was ist der Zweck der WCF-Sitzung?

Antwort

39

Nein, eine zuverlässige Sitzung wird wie jede andere Sitzung ausgezählt. Die Hauptfrage ist wirklich: Warum in aller Welt wollen Sie, dass Ihre Sitzungen "endlos" sind? Wenn Sie das wirklich brauchen, müssen Sie die Timeouts in der Sitzung erhöhen.

Der Punkt einer zuverlässigen Sitzung ist, dass der Anrufer über alle verlorenen Nachrichten informiert wird. Entgegen der landläufigen Meinung kann die zuverlässige Sitzung die Zustellung einer Nachricht nicht garantieren - aber wenn eine Nachricht nicht zugestellt werden kann, wird zumindest der Anrufer davon erfahren.

prüfen einige dieser Ressourcen für mehr Hintergrundinformationen aus:

+0

Dank für die Klärung, was zuverlässige Sitzung für ist. In Bezug auf "endlose" Sitzung: Ich habe ein ereignisgesteuertes System. Wenn eine Nachricht kommt, sollte der Client einen WCF-Dienst aufrufen. Nachrichten können jede Sekunde kommen und es ist wichtig, mit jedem Schritt Schritt zu halten. Manchmal kann das Intervall zwischen dem Empfang einer Nachricht viel länger als eine Sekunde sein, beispielsweise ein oder zwei Tage. Also brauche ich einen Keep-Alive-Mechanismus. –

+1

@bsnote: warum? Wenn das Intervall zwischen zwei Nachrichten zwei Tage beträgt, hat es wirklich keinen Sinn, diese Sitzung zu starten und aktiv zu sein, meiner Meinung nach. –

+0

Es ist zu teuer, jedes Mal einen Kanal zu erstellen, wenn eine Nachricht empfangen wird, wenn Nachrichten gesendet werden werden jede Sekunde empfangen. Obwohl ich stimme zu, dass es keinen Sinn hat, eine Sitzung zu haben, wenn das Intervall einen Tag beträgt. –

6

wenn Sie das Programm nicht verwenden, es wird geschlossen nach einer Weile. können Sie das Standard-Timeout (das ist 10 min) von der Bindung ändern.

NetTcpBinding binding = new NetTcpBinding(); 
binding.ReceiveTimeout = TimeSpan.MaxValue; 
binding.ReliableSession.InactivityTimeout = TimeSpan.MaxValue; 

mehr lesen bei MSDN