WCF: прокси открывать и закрывать. - PullRequest
4 голосов
/ 15 мая 2010

Я поддерживаю приложение Windows Forms, используя WCF, и использую Net.TCP для внутреннего использования. Жизненный цикл наших соединений - GET / USE / CLOSE.

Возникла проблема с аварийным завершением пула приложений. Просматривая netstat, я вижу, когда захожу в приложение, поскольку у нас есть служба входа. Однако, даже если мы создаем прокси в операторе using, соединение в netstat не исчезает, пока я физически не закрою приложение.

Это правильно? Должен ли я делать что-то другое на клиенте, чтобы принудительно закрыть соединение?

То есть, если соединение остается открытым, оно остается открытым в течение времени установки openTimeout, а затем разрывается?

Ответы [ 3 ]

4 голосов
/ 18 сентября 2012

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

WCFServiceClient c = new WCFServiceClient();

try
{
    c.HelloWorld();
}
catch
{
    // acknowledge the Faulted state and transition to Closed
    c.Abort();

    // handle or throw
    throw;
}
finally
{
    c.Close();
}

В статье говорится, что вы должны избегать using, поскольку он не закрывается должным образом и не удаляет объект клиента службы WCF, вместо этого вы должны сделать это с помощью блока try ... catch ... finally, как показано выше - таким образом вы Вы имеете дело с исключениями (которые прервут, а затем повторно сгенерируют или обработают исключение), а также вы позаботитесь о окончательном закрытии соединения. Это также четко указано в советах Microsoft по устранению неполадок WCF.

Примечание: c.Close() в finally не приносит никакого вреда в случае исключения (состояние ошибки), потому что мы вызываем c.Abort() до того, как исключение будет переброшено, поэтому c.Close() фактически ничего не делает в этом случае. Однако, если исключение не происходит, тогда c.Close() фактически выполняется нормально, и соединение закрывается, как и ожидалось.

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

0 голосов
/ 15 мая 2010

Да, это ожидаемое поведение: привязка Net.TCP имеет транспортный сеанс на уровне протокола с вашим сервером, что вы не можете контролировать в WCF.

Я не знаю ни одного механизма в WCF, чтобы физически разорвать этот сеанс транспортного уровня - вы могли бы сделать это, используя низкоуровневые вызовы TCP, но у меня никогда не было необходимости делать что-то подобное .

0 голосов
/ 15 мая 2010

Во-первых, вы, вероятно, не должны использовать свой прокси в контексте оператора using, даже если он реализует IDisposable: http://stevesmithblog.com/blog/idisposable-and-wcf/

Это, как говорится, все зависит от того, как вы используете прокси. Посмотрите на ответ Марка здесь: C #, WCF, Когда повторно использовать прокси на стороне клиента

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