Тайм-аут с использованием Hybrid ConnectionMode с привязкой ретранслятора TCP в шине сообщений Azure

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

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();

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

Робин


person Rob    schedule 03.10.2014    source источник
comment
Привет. Это очень старый пост, но вы нашли решение? Я вижу точно такую ​​​​же проблему при запуске примеров.   -  person Mark W    schedule 02.03.2017


Ответы (1)


Вам нужно установить 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();
person Mark W    schedule 02.03.2017