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
            };
        }
示例#2
0
        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;
        }
示例#5
0
        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;
            }
        }
示例#7
0
        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]);
                }
            }
        }