/ / Trwałe połączenie aplikacji klienckiej WCF z serwerem innym niż WCF (DataSnap) - wcf, delphi, delphi-xe2, datasnap, trwałe połączenie

WCF (DataSnap) - stałe połączenie z WCF

Co działa

Zbudowałem DataSnap Serwis internetowy w Delphi-XE2, który używa TDSServer i TDSHTTPService składniki. Klienci dołączają do serwera (Serwis internetowy) i uruchomić metody serwera DataSnap w celu pobrania danych. Serwer używa TDSLifeCycle.Session dla wszystkich połączeń. Chcę nadal korzystać Session jeśli to możliwe, ponieważ przechowuję informacje o sesji w zmiennych wątku ...

ja mogą użyj Internet Explorera do uwierzytelnienia się na ipobrać dane z serwera DataSnap. Jeśli nie pozwolę IE siedzieć bezczynnie przez 30 sekund (lub rozłącza się z serwerem), to ponownie użyje tego samego połączenia dla każdego żądania metody.

ja mogą użyj prostej aplikacji Delphi, która używa TIdHTTP do połączenia z serwerem DataSnap. Dodawanie keep-alive do tego Request.Connection właściwość sprawia, że ​​pozostaje połączony na zawsze i ponownie użyj jeden połączenie dla wszystkich wywołań metod.

.

Problem

Firma zewnętrzna buduje aplikację WCF, aby uzyskać dostęp do usługi DataSnap. Nie mogą korzystać z aplikacji WCF tylko jeden połączenie z usługą. Początkowe żądanie uwierzytelnienia i pierwsze wywołanie metody używają tego samego połączenia, ale kolejne żądania tworzą nowe połączenia, widoczne po uruchomieniu netstat na swoim komputerze i widząc nowe ESTABLISHEDpołączenia z ich aplikacji do mojej usługi przy użyciu wielu portów źródłowych. Nowe połączenia tworzą nowe wątki w serwerze DataSnap, który nie może uzyskać dostępu do zmiennych sesji uwierzytelnionego wątku.

.

Możliwe rozwiązanie

Wiem, że mogę zmienić serwer DataSnap na Invocation modelu, co nie jest konieczne do utrzymania jeden stałe połączenie na klienta, i zrobi to w razie potrzeby. Zanim to zrobiłem, uznałem, że rozsądnie jest sprawdzić, czy ktoś wie, jak rozwiązać problem.

.

Moje pytanie

Czy aplikacja kliencka WCF może utworzyćpojedyncze stałe połączenie z serwerem innym niż WCF (serwer DataSnap), którego używa do wszystkich wywołań metod bez tworzenia nowych połączeń? Jak to się robi? Czy jest to tak proste, jak dodanie odpowiedniego [dekoracji] do projektu C # WCF w Visual Studio?

Wszelkie sugestie są bardzo mile widziane!

.

FYI - Nie mam dostępu do kodu zewnętrznego, więc nie mogę dostarczyć próbek kodu WCF.

Odpowiedzi:

0 dla odpowiedzi № 1

Twoja aplikacja Delphi zapewnia stanową usługę internetową (używając zmiennych sesji), oraz Usługi sieciowe WCF są domyślnie bezstanowe, w tym klientów WCF.

Może ta odpowiedź wskazuje na poprawną konfigurację (wsHttpBinding i SessionMode ServiceContract).

Z dokumentacji MSDN:

Na przykład, jeśli właściwość SessionMode jest ustawiona na SessionMode.Required i właściwość InstanceContextMode jest ustawiona na PerSession, klienci mogą korzystać z to samo połączenie wykonywać wielokrotne połączenia do tego samego obiektu usługi.

(podkreślenie przeze mnie)


Jednak, ponieważ DataSnap nie jest pierwotnie zaprojektowanydla współdziałania z WCF może być łatwiejsze przeprojektowanie strony Delphi do korzystania z bezpaństwowego modelu usługi sieciowej zamiast stanu. Wymagałoby to uwierzytelnienia przy każdym zgłoszeniu serwisowym, ale wewnętrznie usługa internetowa Delphi może niektóre dane w pamięci podręcznej skrócić czasy wyszukiwania, podobnie do bieżącego stanu sesji.