/ / WCF Client App Постійне підключення до сервера WCF (DataSnap) - wcf, delphi, delphi-xe2, datasnap, persistent-connection

Клієнтський додаток WCF Персистентне підключення до сервера не WCF (DataSnap) - wcf, delphi, delphi-xe2, datasnap, постійне з'єднання

Що працює

Я побудував DataSnap веб-служби в Delphi-XE2, який використовує TDSServer і TDSHTTPService компонентів. Клієнти прикріплюються до сервера (веб-служби) і запустити методи сервера DataSnap для отримання даних. Сервер використовує TDSLifeCycle.Session для всіх з'єднань. Я хочу продовжувати використовувати Session якщо це можливо, оскільки я зберігаю інформацію про сеанс у змінних потоку ...

Я може використовуйте Internet Explorer для автентифікації до таотримання даних з сервера DataSnap. Якщо я не дозволяю IE сидіти в режимі очікування протягом 30 секунд (або він відключається від сервера), він буде повторно використовувати те ж саме з'єднання для кожного запиту методу.

Я може використовувати просте додаток Delphi, яке використовує TIdHTTP для підключення до сервера DataSnap. Додавання keep-alive до його Request.Connection власність змушує його залишатися на зв'язку назавжди і повторне використання один з'єднання для всіх викликів методів.

.

Проблема

Компанія третьої сторони створює додаток WCF для доступу до служби DataSnap. Вони не можуть використовувати додаток WCF тільки один з'єднання з послугою. Початковий запит аутентифікації і 1-й виклик методу використовують одне і те ж з'єднання, але наступні запити створюють нові з'єднання, що видно за допомогою запуску netstat на своєму комп'ютері і бачити нову ESTABLISHEDз'єднання з їх додатків до моєї служби за допомогою декількох вихідних портів. Нові підключення створюють нові потоки на сервері DataSnap, який може "отримати доступ до змінних сеансу аутентифікованого потоку".

.

Можливе вирішення проблеми

Я знаю, що я можу змінити сервер DataSnap на Invocation модель, що робить її непотрібною для підтримки один постійне підключення на кожного клієнта, і буде робити це у разі потреби. Перш ніж робити це, я думав, що розумно побачити, чи хтось ще знає, як вирішити проблему.

.

Мій питання

Чи можливо для клієнтської програми WCF створити aодноразове постійне підключення до не-WCF-сервера (сервер DataSnap), який він використовує для всіх викликів методів без створення нових з'єднань? Як це робиться? Чи так просто, як додати правильне [прикраса] до проекту C # WCF у Visual Studio?

Будь-які пропозиції дуже вдячні!

.

FYI - я не маю доступу до коду третьої сторони, так що я не можу надавати зразки коду WCF.

Відповіді:

0 для відповіді № 1

Ваша програма Delphi надає веб-сервіс, що підтримує стан (за допомогою змінних сеансу), і Веб-сервіси WCF за замовчуванням не мають статусу, включаючи клієнтів WCF.

Може бути ця відповідь вказує на правильну конфігурацію (wsHttpBinding і Сеансовий режим контракту ServiceContract).

З документації MSDN:

Наприклад, якщо для параметра SessionMode встановлено значення SessionMode.Required і властивість InstanceContextMode має значення PerSession, клієнти можуть використовувати Таке ж з'єднання для повторних дзвінків на той самий об'єкт обслуговування.

(виділення мною)


Однак, так як DataSnap не призначений в першу чергудля функціональної сумісності з WCF може бути простіше перепроектувати сторону Delphi для використання моделі веб-сервісу без статусу замість stateful. Це вимагало б аутентифікації з кожним запитом сервісу, але внутрішньо веб-служба Delphi могла б мати деякі дані кешу для зменшення часу пошуку, подібно до поточного стану сеансу.