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

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

Затем я наткнулся на этот блог Джесси Эзелла, который, кажется, указывает на то, что Плохо держать канал открытым бесконечно долго, потому что вы не можете поймать ошибки, и это вызывает всевозможные нестабильности.

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


person Shaul Behr    schedule 02.01.2011    source источник


Ответы (2)


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

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

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

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

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

person marc_s    schedule 02.01.2011

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

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

person Ladislav Mrnka    schedule 02.01.2011