Що працює
Я побудував 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 могла б мати деякі дані кешу для зменшення часу пошуку, подібно до поточного стану сеансу.