Esempio n. 1
0
        internal static UriPrefixTable <HandshakeDelegate> BuildAddressTable(IServiceProvider services)
        {
            ILogger <NetMessageFramingConnectionHandler> logger = services.GetRequiredService <ILogger <NetMessageFramingConnectionHandler> >();
            IServiceBuilder    serviceBuilder    = services.GetRequiredService <IServiceBuilder>();
            IDispatcherBuilder dispatcherBuilder = services.GetRequiredService <IDispatcherBuilder>();
            var addressTable = new UriPrefixTable <HandshakeDelegate>();

            foreach (Type serviceType in serviceBuilder.Services)
            {
                List <IServiceDispatcher> dispatchers = dispatcherBuilder.BuildDispatchers(serviceType);
                foreach (IServiceDispatcher dispatcher in dispatchers)
                {
                    if (dispatcher.BaseAddress == null)
                    {
                        // TODO: Should we throw? Ignore?
                        continue;
                    }

                    // TODO: Limit to specifically TcpTransportBindingElement if net.tcp etc
                    BindingElementCollection be = dispatcher.Binding.CreateBindingElements();
                    ConnectionOrientedTransportBindingElement cotbe = be.Find <ConnectionOrientedTransportBindingElement>();
                    if (cotbe == null)
                    {
                        // TODO: Should we throw? Ignore?
                        continue;
                    }

                    IServiceDispatcher _serviceDispatcher = null;
                    var _customBinding = new CustomBinding(dispatcher.Binding);
                    if (_customBinding.Elements.Find <ConnectionOrientedTransportBindingElement>() != null)
                    {
                        var parameters = new BindingParameterCollection();
                        if (_customBinding.CanBuildServiceDispatcher <IDuplexSessionChannel>(parameters))
                        {
                            _serviceDispatcher = _customBinding.BuildServiceDispatcher <IDuplexSessionChannel>(parameters, dispatcher);
                        }
                    }
                    _serviceDispatcher = _serviceDispatcher ?? dispatcher;
                    HandshakeDelegate handshake = BuildHandshakeDelegateForDispatcher(_serviceDispatcher);

                    logger.LogDebug($"Registering URI {dispatcher.BaseAddress} with NetMessageFramingConnectionHandler");
                    addressTable.RegisterUri(dispatcher.BaseAddress, cotbe.HostNameComparisonMode, handshake);
                }
            }

            return(addressTable);
        }