Почему WCF не уничтожает объект, когда я закрываю клиентское приложение без вызова метода «Закрыть» на стороне клиента? - PullRequest
4 голосов
/ 16 июня 2009

У меня есть служба net tcp WCF следующим образом

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class AVService : IAVService
    {
        static int _numberofInst = 0;
        public AVService()
        {
            ++_numberofInst;
            Console.WriteLine("Number of instances "+_numberofInst);
        }
        ~AVService()
        {
            --_numberofInst;
            Console.WriteLine("Number of instances " + _numberofInst);
        }
        public void Foo(){}
    }

Когда я создаю объект на стороне клиента следующим образом

AVService client = new AVService();
client.Foo();

Конструктор вызывается, но когда я закрываю клиентское приложение без вызова close mehotd, деструктор не вызывается? Зачем? это значит, что сервисный объект все еще работает на сервере?

1 Ответ

3 голосов
/ 16 июня 2009

Да - если вы явно не распоряжаетесь своим клиентом, сервер некоторое время будет «зависать» (поскольку вы указали режим PerSession ).

Время ожидания истечет (задано параметром InactivityTimeout в конфигурации привязки) и будет уничтожено. Но это может занять некоторое время (от нескольких минут до нескольких часов, в зависимости от ваших настроек).

<bindings>
   <netTcpBinding>
      <binding name="NetTcp_Reliable" receiveTimeout="00:20:00">
         <reliableSession enabled="true" ordered="false" 
                          inactivityTimeout="00:15:00" />
      </binding>
   </netTcpBinding>
</bindings>

Таким образом, рекомендуется всегда утилизировать клиента перед закрытием приложения .

...