WCF - это плохая практика оставлять канал открытым на долгое время? - PullRequest
9 голосов
/ 02 января 2011

Я только изучаю веревки вокруг WCF.Я планировал открыть дуплексный канал между клиентом и сервером, используя NetTcpBinding, и держать его открытым неограниченное время, чтобы сервер мог инициировать запросы к клиенту.

Затем я наткнулся на это блог Джесси Эзелла , который, кажется, указывает на то, что держать канал открытым на неопределенное время плохо, потому что вы не можете уловить ошибки, и это вызывает всевозможные нестабильности.Если я использую NetTcpBinding и сохраню ссылку на открытый канал по обе стороны отношения, что произойдет, если произойдет сбой связи?Как я могу поймать событие сбоя?Какие еще есть ошибки?Есть ли разница, какую платформу .NET вы используете?(Я на 4.0.)

Ответы [ 2 ]

14 голосов
/ 02 января 2011

Я не согласен с Джесси ( в качестве примечания: он также рекомендует по умолчанию использовать классы обслуживания WCF в качестве одиночных, что, на мой взгляд, является худшей идеей ) .....

Пока вы тщательно следите за перехватом исключений на сервере (например, реализуя интерфейс IErrorHandler в своем классе обслуживания), здесь нет смысла продолжать закрывать ваш канал ... особенно не всреда корпоративной локальной сети, использующая netTcpBinding.

В отличие, например, от подключения к базе данных, которое часто сопряжено с расходами на лицензирование, поддержание открытого сетевого подключения к вашему сервисному компьютеру не должно вызывать никаких проблем.Как правило, это также не ограниченный ресурс, поэтому постоянно открывать и закрывать его кажется бессмысленным.

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

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

7 голосов
/ 02 января 2011

Да, хорошей практикой является закрытие канала, как только он больше не нужен.Но это не обычно в случае дуплексной связи.Когда вы используете дуплексную связь, вам нужен открытый канал, чтобы сервер мог отправлять сообщения обратно клиенту.Связь WCF всегда инициируется клиентом.Обратный вызов разрешен только при открытом канале, инициированном клиентом.

Дуплексная связь включает в себя некоторые дополнительные задачи для обработки сбоев соединения.Ваша служба должна содержать некоторый механизм проверки связи, позволяющий клиенту регулярно проверять соединение.Если соединение не установлено, клиент получает исключение, и вы сможете восстановить соединение.Также служба должна обрабатывать исключение при отправке сообщения обратного вызова в неисправный канал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...