Служба WCF теряет дескрипторы и память, когда клиент истекает - PullRequest
1 голос
/ 05 октября 2011

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

[OperationContract]
public bool someMethod() {
    Thread.Sleep(60000);
    return true;
}

На клиенте:

public void callSomeMethod() {
     using (var proxy = getProxy()) {
         proxy.someMethod();
     }
}

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

Примечание. На клиенте я намеренно не выполняю очистку, используя Close () / Abort () для этого теста. Моя теория состоит в том, что, если клиент когда-либо соединяется с сервером, но прерывается прежде, чем соединение может быть очищено, сервер протечет.

Последнее слово: когда я смотрю на ProcessExplorer, он показывает, что мои утечки - это сокеты TCP.

Есть ли лучший способ справиться с этой серверной стороной? Я видел ссылки на использование ChannelFactory, но я не уверен в деталях (это даже код на стороне сервера?). Если да, то даст ли мне больше контроля над тем, чтобы убедиться, что состояния ошибок корректно очищаются?

EDIT

С тех пор я провел некоторый поиск в ChannelFactory и вижу, что это функция на стороне клиента, а не на стороне сервера, поэтому не обращайте на это внимания. Тем не менее, все еще открыто о том, есть ли способ более правильно очистить утечку портов.

1 Ответ

2 голосов
/ 12 октября 2011

Как выяснилось, я запускал свой сервис из [STAThread] - всякий раз, когда приложение использует COM-вызовы, вы можете потерять память, если не используете режим [MTAThread].

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