2014-10-03 5 views
2

Я пробовал код примера msdn (http://code.msdn.microsoft.com/windowsazure/Relayed-Messaging-Bindings-ca039161) и имел ту же проблему, с которой я столкнулся в своем тестовом приложении. У меня есть пример, который отлично работает в режиме Relay, но как только я переключаюсь на Hybrid, клиент не может подключиться к серверу с исключением таймаута. Я увеличил таймауты и включил отслеживание, но все трассировки показывают кучу предупреждений, например.Тайм-аут с использованием гибридного соединенияMode с привязкой к ретрансляции TCP в шине сообщений Azure

Failed to open Microsoft.ServiceBus.Channels.ClientFramingDuplexSessionChannel 
Failed to open Microsoft.ServiceBus.SocketConnectionChannelFactory`1+DuplexSessionChannel[System.ServiceModel.Channels.IDuplexSessionChannel] 

Я попытался настроек режима подключения системы среды настройки между Tcp, Http и AutoDetect без успеха.

Код для сервера:

  ServiceHost sh = new ServiceHost(typeof(Service1)); 
     var uri = ServiceBusEnvironment.CreateServiceUri("sb", "<serverNamespace>", "testing"); 
     var binding = new NetTcpRelayBinding(); 
     binding.ConnectionMode = TcpRelayConnectionMode.Hybrid; 
     binding.Security.Mode = EndToEndSecurityMode.None; 
     binding.OpenTimeout = new TimeSpan(0,0,10,0); 
     binding.ReceiveTimeout = new TimeSpan(0, 0, 10, 0); 
     binding.SendTimeout = new TimeSpan(0, 0, 10, 0); 

     sh.AddServiceEndpoint(
      typeof(IService1), new NetTcpRelayBinding(), uri 
      ) 
      .Behaviors.Add(new TransportClientEndpointBehavior 
      { 
       TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("<keyName>", "<sharedaccesskey>") 
      }); 

     sh.Open(); 

     Console.WriteLine("Press ENTER to close"); 
     Console.ReadLine(); 

     sh.Close(); 

Код для клиента:

  var binding = new NetTcpRelayBinding {ConnectionMode = TcpRelayConnectionMode.Hybrid}; 
     binding.Security.Mode = EndToEndSecurityMode.None; 
     binding.OpenTimeout = new TimeSpan(0, 0, 10, 0); 
     binding.ReceiveTimeout = new TimeSpan(0, 0, 10, 0); 
     binding.SendTimeout = new TimeSpan(0, 0, 10, 0); 
     binding.CloseTimeout = new TimeSpan(0, 0, 10, 0); 

     var cf = new ChannelFactory<IService1>(
      binding, 
      new EndpointAddress(
       ServiceBusEnvironment.CreateServiceUri("sb", "<serviceNamespace>", "testing") 
       )); 

     cf.Endpoint.Behaviors.Add(new TransportClientEndpointBehavior 
     { 
      TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("<keyName>", "<sharedAccessKey>") 
     }); 

     var ch = cf.CreateChannel(); 

     ((ICommunicationObject)ch).Open(); 
     Console.WriteLine(ch.GetData(5)); 
     Console.ReadLine(); 

Спасибо за чтение,

Робин

+0

Hi. Это очень старый пост, но нашли ли вы решение? Я вижу ту же проблему при запуске примеров. –

ответ

0

Вы должны установить OperationTimeout на клиенте, созданного ChannelFactory:

var ch = cf.CreateChannel(); 

    // Add this Line 
    ch.OperationTimeout = new TimeSpan(0, 0, 10, 0); 

    ((ICommunicationObject)ch).Open(); 
    Console.WriteLine(ch.GetData(5)); 
    Console.ReadLine();