2012-01-21 5 views
4

В клиенте, я пытаюсь подключиться к WCF изменений OpenTimeout свойства до 5 секунд, но это не работает .... вот как я создаю канал:ФОС ChannelFactory и opentimeout

NetTcpBinding bind = new NetTcpBinding(SecurityMode.None); 
bind.OpenTimeout = new TimeSpan(0, 0, 5); 
var channel = new ChannelFactory<IService>(bind, new EndpointAddress(myAddr)); 
channel.CreateChannel(); 

После этого я вызываю метод, но если сервер отсутствует, требуется 21 секунда, а не 5, которые я изменил на OpenTimeout. Я что-то пропустил?

Tks

+1

Если вы разместите код, XML или данные образцы ** ** PLEASE выделить те строки в текстовом редакторе и нажмите на кнопку «код образцы» ('{}') на панели инструментов редактора, чтобы красиво формат и синтаксис подчеркнуть это! –

+0

Извините @marc_s Я действительно забыл – Alexandre

+0

@Alexandre Вы нашли решение этой проблемы, потому что я столкнулся с той же проблемой – Carlos487

ответ

0

Оказывается, что есть другие вещи, WCF делает которые не входят в opentimeout. Посмотрите на эту тему

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/5f347965-13bf-4a2d-ae82-74ad38a8d7d1/

[Редактировать] Когда я попытался это с .NET 4.0, когда ФОС услуга не доступна таймаут происходит с в 2secs. Opentimeout не влияет. Если служба wcf доступна, но не отвечает за причину, вы можете заставить клиента ждать столько, сколько захотите, установив параметр sendtimeout при привязке.

+0

Я пробовал последнее сообщение в теме, но это не сработало – Alexandre

1

Решение, которое я нашел, проверяет, установлен ли сервер ФОС вверх (перед вызовом метода), вот как:

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
sock.ReceiveTimeout = sock.SendTimeout = 500; 
IAsyncResult res = sock.BeginConnect(ip, port, null, null); 
bool success = res.AsyncWaitHandle.WaitOne(500, true); 
+0

Проблема это решение является одновременным доступом .... иногда сокет возвращает false, если занято – Alexandre

5

Я решил эту проблему следующим способом. Кажется, это работы.

protected TServiceContract CreateChannel() 
    { 
     TServiceContract channel = factory.CreateChannel(); 

     var ar = ((IChannel)channel).BeginOpen(null, null); 

     if(!ar.AsyncWaitHandle.WaitOne(factory.Endpoint.Binding.OpenTimeout, true)) 
     { 
      throw new TimeoutException("Service is not available"); 
     } 

     ((IChannel)channel).EndOpen(ar); 

     return channel; 
    } 
+1

Вы пробовали одновременный доступ? – Alexandre

+0

Если вы сказали о создании параллельного канала - да. У меня нет проблем. – Mimas

Смежные вопросы