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