Тайм-аут с использованием 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();
Спасибо за прочтение,
Робин
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();