NetTcpBinding с потоковой передачей и сессией

Я пытаюсь создать WcfService с использованием NetTcpBinding. Я использую режим Transfer, Переданный потоком, так как я передам большие файлы. Я должен использовать Сессию, и я считал, что NetTcpBinding поддерживает это, но когда я включаю его как:

SessionMode=SessionMode.Required

Я получаю ошибку:

Система. InvalidOperationException: Контракт требует, чтобы Сессия, но Связывающий 'NetTcpBinding' не поддерживала его или не была настроена правильно для поддержки его.

Кто-либо знает то, что я должен сделать, чтобы заставить NetTcpBinding работать с сессиями? Спасибо за любую справку :)

5
задан Jørn Schou-Rode 5 January 2010 в 09:23
поделиться

1 ответ

Вы, несомненно, решили эту проблему - но для других, кто сталкивался с этим (как и я) ...

Согласно «Программированию служб WCF» Ювала Лоуи - вы не можете использовать потоковую передачу с контрактом, который настроен SessionMode.Required. См. Стр. 243

Вы также не можете использовать NetTcpBinding для надежного обмена сообщениями с потоковой передачей.

Не уточняется, почему.

Одним из способов решения проблемы может быть разделение операций, для которых требуется режим сеанса, в отдельный контракт, а операции потоковой передачи - в другой. Затем реализовать уникальный идентификатор для каждого клиента (уникальный идентификатор GUID на время существования клиентского приложения) который передается в непотоковом интерфейсе как операция RegisterSession (Guid mySessionId). Когда сеансы создаются на сервере, они могут регистрироваться с помощью объекта диспетчера сеансов, который хранит пару GUID, SessionContractImplemenation в словаре.

Затем добавьте параметр в операцию контракта потоковой передачи (тот же GUID), чтобы реализация контракта потоковой передачи могла получить доступ к живому непотоковому объекту (через созданный вами диспетчер сеансов - используя предоставленный GUID).

Конечно, вам придется правильно управлять временем жизни сеанса.

От Microsoft ...

Сеансы и потоковая передача Если у вас есть большой объем данных для передачи, режим потоковой передачи в WCF является реальной альтернативой стандартному поведению буферизации и обработки сообщений в память в целом. Вы можете получить неожиданное поведение при потоковой передаче вызовов с привязкой на основе сеанса.Все вызовы потоковой передачи выполняются через один канал (канал дейтаграммы), который не поддерживает сеансы, даже если используемая привязка настроена для использования сеансов. Если несколько клиентов выполняют потоковые вызовы к одному и тому же объекту службы через привязку на основе сеанса, а режим параллелизма объекта службы установлен на одиночный, а режим контекста его экземпляра установлен на PerSession, все вызовы должны проходить через канал дейтаграммы, поэтому только один звонок обрабатывается единовременно. Тогда один или несколько клиентов могут истечь по тайм-ауту. Эту проблему можно обойти, установив для параметра InstanceContextMode сервисного объекта значение PerCall или параметр Concurrency - несколько.

Примечание:
MaxConcurrentSessions в этом случае не действуют, поскольку доступен только один «сеанс».

См. http://msdn.microsoft.com/en-us/library/ms733040.aspx

11
ответ дан 13 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: