public async Task<RelayConnection> ConnectAsync() { var tb = new TransportClientEndpointBehavior(tokenProvider); var bindingElement = new TcpRelayTransportBindingElement( RelayClientAuthenticationType.RelayAccessToken) { TransferMode = TransferMode.Buffered, ConnectionMode = TcpRelayConnectionMode.Relayed, ManualAddressing = true }; bindingElement.GetType() .GetProperty("TransportProtectionEnabled", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic) .SetValue(bindingElement, true); var rt = new CustomBinding( new BinaryMessageEncodingBindingElement(), bindingElement); var cf = rt.BuildChannelFactory<IDuplexSessionChannel>(tb); await Task.Factory.FromAsync(cf.BeginOpen, cf.EndOpen, null); var ch = cf.CreateChannel(new EndpointAddress(address)); await Task.Factory.FromAsync(ch.BeginOpen, ch.EndOpen, null); return new RelayConnection(ch) { WriteTimeout = (int) rt.SendTimeout.TotalMilliseconds, ReadTimeout = (int) rt.ReceiveTimeout.TotalMilliseconds }; }
public async Task <RelayConnection> ConnectAsync() { var tb = new TransportClientEndpointBehavior(tokenProvider); var bindingElement = new TcpRelayTransportBindingElement( RelayClientAuthenticationType.RelayAccessToken) { TransferMode = TransferMode.Buffered, ConnectionMode = TcpRelayConnectionMode.Relayed, ManualAddressing = true }; bindingElement.GetType() .GetProperty("TransportProtectionEnabled", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic) .SetValue(bindingElement, true); var rt = new CustomBinding( new BinaryMessageEncodingBindingElement(), bindingElement); var cf = rt.BuildChannelFactory <IDuplexSessionChannel>(tb); await Task.Factory.FromAsync(cf.BeginOpen, cf.EndOpen, null); var ch = cf.CreateChannel(new EndpointAddress(address)); await Task.Factory.FromAsync(ch.BeginOpen, ch.EndOpen, null); return(new RelayConnection(ch) { WriteTimeout = (int)rt.SendTimeout.TotalMilliseconds, ReadTimeout = (int)rt.ReceiveTimeout.TotalMilliseconds }); }
protected override void InitializeFrom(BindingElement bindingElement) { base.InitializeFrom(bindingElement); TcpRelayTransportBindingElement tcpRelayTransportBindingElement = (TcpRelayTransportBindingElement)bindingElement; this.ListenBacklog = tcpRelayTransportBindingElement.ListenBacklog; this.ConnectionMode = tcpRelayTransportBindingElement.ConnectionMode; this.RelayClientAuthenticationType = tcpRelayTransportBindingElement.RelayClientAuthenticationType; this.ConnectionPoolSettings.InitializeFrom(tcpRelayTransportBindingElement.ConnectionPoolSettings); this.IsDynamic = tcpRelayTransportBindingElement.IsDynamic; }
public override void ApplyConfiguration(BindingElement bindingElement) { base.ApplyConfiguration(bindingElement); TcpRelayTransportBindingElement listenBacklog = (TcpRelayTransportBindingElement)bindingElement; listenBacklog.ListenBacklog = this.ListenBacklog; listenBacklog.ConnectionMode = this.ConnectionMode; listenBacklog.RelayClientAuthenticationType = this.RelayClientAuthenticationType; this.ConnectionPoolSettings.ApplyConfiguration(listenBacklog.ConnectionPoolSettings); listenBacklog.IsDynamic = this.IsDynamic; }
public async Task StartAsync() { if (listener != null) { throw new InvalidOperationException(ExceptionMessageListenerHasAlreadyBeenStarted); } try { var tcpRelayTransportBindingElement = new TcpRelayTransportBindingElement(RelayClientAuthenticationType.RelayAccessToken) { TransferMode = TransferMode.Buffered, ConnectionMode = TcpRelayConnectionMode.Relayed, IsDynamic = (relayAddressType == RelayAddressType.Dynamic), ManualAddressing = true }; tcpRelayTransportBindingElement.GetType() .GetProperty("TransportProtectionEnabled", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic) .SetValue(tcpRelayTransportBindingElement, true); var tb = new TransportClientEndpointBehavior(tokenProvider); this.listenerBinding = new CustomBinding( new BinaryMessageEncodingBindingElement(), tcpRelayTransportBindingElement); listener = listenerBinding.BuildChannelListener <IDuplexSessionChannel>(new Uri(address), tb); await Task.Factory.FromAsync(listener.BeginOpen, listener.EndOpen, null); } catch { listener = null; throw; } }
public async Task StartAsync() { if (listener != null) { throw new InvalidOperationException(ExceptionMessageListenerHasAlreadyBeenStarted); } try { var tcpRelayTransportBindingElement = new TcpRelayTransportBindingElement(RelayClientAuthenticationType.RelayAccessToken) { TransferMode = TransferMode.Buffered, ConnectionMode = TcpRelayConnectionMode.Relayed, IsDynamic = (relayAddressType == RelayAddressType.Dynamic), ManualAddressing = true }; tcpRelayTransportBindingElement.GetType() .GetProperty("TransportProtectionEnabled", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic) .SetValue(tcpRelayTransportBindingElement, true); var tb = new TransportClientEndpointBehavior(tokenProvider); this.listenerBinding = new CustomBinding( new BinaryMessageEncodingBindingElement(), tcpRelayTransportBindingElement); listener = listenerBinding.BuildChannelListener<IDuplexSessionChannel>(new Uri(address), tb); await Task.Factory.FromAsync(listener.BeginOpen, listener.EndOpen, null); } catch { listener = null; throw; } }
void System.ServiceModel.Description.IPolicyImportExtension.ImportPolicy(MetadataImporter importer, PolicyConversionContext context) { if (importer == null) { throw new ArgumentNullException("importer"); } if (context == null) { throw new ArgumentNullException("context"); } ICollection <XmlElement> bindingAssertions = context.GetBindingAssertions(); List <XmlElement> xmlElements = new List <XmlElement>(); TcpRelayTransportBindingElement tcpRelayTransportBindingElement = null; RelayClientAuthenticationType relayClientAuthenticationType = RelayClientAuthenticationType.None; bool flag = false; foreach (XmlElement bindingAssertion in bindingAssertions) { if (bindingAssertion.NamespaceURI == "http://schemas.microsoft.com/netservices/2009/05/servicebus/connect") { if (bindingAssertion.LocalName == "RelaySocketConnection") { tcpRelayTransportBindingElement = new TcpRelayTransportBindingElement() { ConnectionMode = TcpRelayConnectionMode.Relayed }; xmlElements.Add(bindingAssertion); } else if (bindingAssertion.LocalName == "HybridSocketConnection") { tcpRelayTransportBindingElement = new TcpRelayTransportBindingElement() { ConnectionMode = TcpRelayConnectionMode.Hybrid }; xmlElements.Add(bindingAssertion); } else if (bindingAssertion.LocalName == "SenderRelayCredential") { relayClientAuthenticationType = RelayClientAuthenticationType.RelayAccessToken; xmlElements.Add(bindingAssertion); } else if (bindingAssertion.LocalName == "ListenerRelayCredential") { xmlElements.Add(bindingAssertion); } } if (!(bindingAssertion.NamespaceURI == "http://schemas.microsoft.com/ws/2006/05/framing/policy") || !(bindingAssertion.LocalName == "SslTransportSecurity")) { continue; } flag = true; xmlElements.Add(bindingAssertion); } if (tcpRelayTransportBindingElement != null) { tcpRelayTransportBindingElement.RelayClientAuthenticationType = relayClientAuthenticationType; tcpRelayTransportBindingElement.TransportProtectionEnabled = flag; context.BindingElements.Add(tcpRelayTransportBindingElement); for (int i = 0; i < xmlElements.Count; i++) { bindingAssertions.Remove(xmlElements[i]); } } }