WCF: ошибка тайм-аута - PullRequest
       7

WCF: ошибка тайм-аута

0 голосов
/ 10 ноября 2009

У меня есть фрагмент кода, который вызывает службу WCF, которая размещена на сервере.

Код продолжает циклически вызывать этот метод снова и снова.(Он запрашивает «статус», поэтому он вообще не выполняет никакой работы).

Это нормально, за исключением того, что через короткий промежуток времени я получаю сообщение об ошибке:
Эта операция запроса отправлена ​​в сеть.tcp: // имя_сервера: 9001 / service1 не получил ответ в течение настроенного времени ожидания (00: 00: 09.9843754)

И вдруг я вообще не могу попасть на сервер НИКОГДА.Я увеличил время ожидания до 1 минуты, но проблема все та же.Обратите внимание, что программа, в которой размещается служба, больше ничего не делает, просто предлагает ее «статус».Так что проблема не в том, что приложение службы WCF занято.

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

Вот код, который я использую для вызова службы.Нужно ли утилизировать ChannelFactory после каждого вызова для его очистки или что я делаю?

        NetTcpBinding binding = new NetTcpBinding(SecurityMode.Message);
                binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

                EndpointAddress endPoint = new EndpointAddress(new Uri(clientPath));

                ChannelFactory<IClient> channel = new ChannelFactory<IClient>(binding, endPoint);
                channel.Faulted += new EventHandler(channel_Faulted);
                IClient client = channel.CreateChannel();

                ((IContextChannel)client).OperationTimeout = new TimeSpan(0, 0, 10);
                ClientStatus clientStatus = client.GetStatus();

1 Ответ

0 голосов
/ 10 ноября 2009

Вы должны закрыть клиентские соединения после того, как завершите вызов GetStatus. Лучший способ сделать это - использовать блок using. Но вы также можете сделать что-то подобное после вызова клиента. GetStatus ()

ClientStatus clientStatus = client.GetStatus();

try
{
    if (client.State != System.ServiceModel.CommunicationState.Faulted)
    {
         client.Close();
    }
}
catch (Exception ex)
{
    client.Abort();
}
...