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 № 1Twoja 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.