Я только изучаю основы WCF. Я планировал открыть дуплексный канал между клиентом и сервером с помощью NetTcpBinding и оставить его открытым на неопределенный срок, чтобы сервер мог инициировать запросы к клиенту.
Затем я наткнулся на этот блог Джесси Эзелла, который, кажется, указывает на то, что Плохо держать канал открытым бесконечно, потому что вы не можете выявить неисправности, а это вызывает всевозможные нестабильности.
Это верно? Если я использую NetTcpBinding и сохраняю ссылку на открытый канал на любой стороне связи, что произойдет, если произойдет сбой связи? Как я могу поймать событие сбоя? Какие еще есть подводные камни? Есть ли разница, какую платформу .NET вы используете? (Я на 4.0.)
2 ответа
Я не согласен с Джесси ( в качестве примечания: он также рекомендует по умолчанию использовать классы обслуживания WCF как синглтоны, что, на мой взгляд, является худшей идеей ) .....
Пока вы хорошо заботитесь об обнаружении исключений на сервере (например, реализуя интерфейс IErrorHandler
в своем классе обслуживания), здесь нет смысла постоянно отключать ваш канал ... особенно в корпоративной среде локальной сети используя netTcpBinding.
В отличие от, например, подключение к базе данных, которое часто требует затрат на лицензирование, сохранение сетевого подключения к обслуживающей машине не должно вызывать никаких проблем. Это также обычно не ограниченный ресурс, поэтому постоянно открывать и закрывать его кажется бессмысленным.
Если вы держите свой канал обслуживания открытым в течение более длительного периода времени, вам необходимо иметь возможность на стороне клиента обрабатывать сбои - например, вам нужно иметь возможность восстанавливаться из ситуации, когда канал вышел из строя, когда в конце концов возникло исключение (например, сеть не работает или что-то в этом роде).
Но если вы это сделаете, то я не вижу никакой пользы в том, чтобы постоянно закрывать ваш канал после каждого звонка и открываться для следующего ...
Да, рекомендуется закрыть канал, как только он больше не нужен. Но это необычно для дуплексной связи. Когда вы используете дуплексную связь, вам нужен открытый канал, чтобы сервер мог отправлять сообщения обратно клиенту. Связь WCF всегда инициируется клиентом. Обратный вызов разрешен только при сохранении открытого канала, инициированного клиентом.
Дуплексная связь включает в себя некоторые дополнительные задачи для обработки сбоев подключения. Ваша служба должна содержать некоторый механизм ping, чтобы клиент мог регулярно проверять соединение. Если соединение не удается, клиент получает исключение, и вы сможете восстановить соединение. Также служба должна обрабатывать исключение при отправке сообщения обратного вызова на неисправный канал.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.