WCF: канал, использующий связывание с потоковой передачей, не является ошибкой, когда сервер не существует - PullRequest
0 голосов
/ 13 декабря 2010

Я пишу мини-фреймворк, чтобы помочь с соединениями клиент-сервер с использованием WCF, и я столкнулся с неожиданным поведением.

Если клиент открывает канал для службы, которая недоступна, изатем выполняет вызов метода по отношению к этой услуге, результирующее поведение отличается в зависимости от того, имеет ли привязка для канала значение TransferMode, установленное на «Потоковое преобразование».

Если для привязки не установлено потоковоеслужба недоступна, WCF немедленно вызывает событие ICommunicationObject.Faults.С другой стороны, если это так, WCF вызывает событие ICommunicationObject.Opened.

Может кто-нибудь объяснить причину такой разницы в поведении?Кажется довольно странным.

1 Ответ

0 голосов
/ 13 декабря 2010

Что ж, я исследовал это в течение нескольких часов и считаю, что у меня есть ответ (в конечном итоге я отмечу его как ответ, если никто не имеет лучшего ответа).

Согласно эта статья на msdn: «Все потоковые вызовы осуществляются через один канал ( канал дейтаграммы ), который не поддерживает сеансы, даже если используемая привязка настроена на использование сеансов».(Обратите внимание на текст, выделенный жирным шрифтом.) Хотя мне не очень понятно, что значит использовать канал дейтаграмм по протоколу TCP / IP, я возьму его по номиналу.

Итак, в другой статье MSDN говорится, что «канал дейтаграммы - это канал, в котором все сообщения некоррелированы. В случае канала дейтаграммы в случае сбоя операции ввода или вывода следующая операция обычно не затрагивается, и тот же канал может бытьиз-за этого каналы дейтаграмм обычно не срабатывают. "

Так что, очевидно, потоковые каналы просто не срабатывают.Хотя попытка отправить сообщение по каналу вызывает исключение сокета (потому что если служба недоступна, очевидно, сокет не может быть открыт), то, что касается WCF, это не означает, что состояние канала является ошибочным.То есть вы все еще можете отправить другое сообщение по тому же каналу, и, если услуга станет доступной, сообщение может успешно передаться.

Мне все еще кажется странным, что состояние канала считается открытым, когдасокетное соединение никогда не было сделано.Так что я все равно был бы рад услышать объяснение, если кто-то имеет более глубокое понимание этого.

...