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; } HandshakeDelegate handshake = BuildHandshakeDelegateForDispatcher(dispatcher); logger.LogDebug($"Registering URI {dispatcher.BaseAddress} with NetMessageFramingConnectionHandler"); addressTable.RegisterUri(dispatcher.BaseAddress, cotbe.HostNameComparisonMode, handshake); } } return(addressTable); }
public TelegramBotData(ITelegramBotClient bot, IDispatcherBuilder dispatcherBuilder, string endpoint, string basePath = "/telegram") { Endpoint = endpoint; Bot = bot; Dispatcher = dispatcherBuilder.SetTelegramBotData(this).Build(); BasePath = basePath; }
public NetMessageFramingConnectionHandler(IServiceBuilder serviceBuilder, IDispatcherBuilder dispatcherBuilder, IFramingConnectionHandshakeBuilder handshakeBuilder) { _serviceBuilder = serviceBuilder; _dispatcherBuilder = dispatcherBuilder; _handshake = BuildHandshake(handshakeBuilder); _services = handshakeBuilder.HandshakeServices; serviceBuilder.Opened += OnServiceBuilderOpened; }
public ServiceModelHttpMiddleware(RequestDelegate next, IApplicationBuilder app, IServiceBuilder serviceBuilder, IDispatcherBuilder dispatcherBuilder, ILogger <ServiceModelHttpMiddleware> logger) { _app = app; _serviceBuilder = serviceBuilder; _dispatcherBuilder = dispatcherBuilder; _next = next; _logger = logger; _branch = BuildBranchAndInvoke; serviceBuilder.Opened += ServiceBuilderOpenedCallback; }
public static void BuildDispatcherWithConfiguration_XmlSerializer() { string serviceAddress = "http://localhost/dummy"; var services = new ServiceCollection(); services.AddLogging(); services.AddServiceModelServices(); IServer server = new MockServer(); services.AddSingleton(server); services.AddSingleton(typeof(ILogger <>), typeof(NullLogger <>)); services.RegisterApplicationLifetime(); ServiceProvider serviceProvider = services.BuildServiceProvider(); IServiceBuilder serviceBuilder = serviceProvider.GetRequiredService <IServiceBuilder>(); serviceBuilder.BaseAddresses.Add(new Uri(serviceAddress)); serviceBuilder.AddService <SimpleXmlSerializerService>(); var binding = new CustomBinding("BindingName", "BindingNS"); binding.Elements.Add(new MockTransportBindingElement()); serviceBuilder.AddServiceEndpoint <SimpleXmlSerializerService, ISimpleXmlSerializerService>(binding, serviceAddress); serviceBuilder.OpenAsync().GetAwaiter().GetResult(); IDispatcherBuilder dispatcherBuilder = serviceProvider.GetRequiredService <IDispatcherBuilder>(); System.Collections.Generic.List <IServiceDispatcher> dispatchers = dispatcherBuilder.BuildDispatchers(typeof(SimpleXmlSerializerService)); Assert.Single(dispatchers); IServiceDispatcher serviceDispatcher = dispatchers[0]; Assert.Equal("foo", serviceDispatcher.Binding.Scheme); Assert.Equal(serviceAddress, serviceDispatcher.BaseAddress.ToString()); IChannel mockChannel = new MockReplyChannel(serviceProvider); IServiceChannelDispatcher dispatcher = serviceDispatcher.CreateServiceChannelDispatcherAsync(mockChannel).Result; var requestContext = XmlSerializerTestRequestContext.Create(serviceAddress); dispatcher.DispatchAsync(requestContext).Wait(); Assert.True(requestContext.WaitForReply(TimeSpan.FromSeconds(5)), "Dispatcher didn't send reply"); requestContext.ValidateReply(); }
public NetMessageFramingConnectionHandler(IServiceBuilder serviceBuilder, IDispatcherBuilder dispatcherBuilder, IFramingConnectionHandshakeBuilder handshakeBuilder) { _serviceBuilder = serviceBuilder; _dispatcherBuilder = dispatcherBuilder; _handshake = BuildHandshake(handshakeBuilder); }
private RequestDelegate BuildBranch(IApplicationBuilder app, IServiceBuilder serviceBuilder, IDispatcherBuilder dispatcherBuilder) { var branchApp = app.New(); var serverAddresses = app.ServerFeatures.Get <IServerAddressesFeature>(); foreach (var address in serverAddresses.Addresses) { serviceBuilder.BaseAddresses.Add(new Uri(address)); } foreach (var serviceType in serviceBuilder.Services) { var dispatchers = dispatcherBuilder.BuildDispatchers(serviceType); foreach (var dispatcher in dispatchers) { if (dispatcher.BaseAddress == null) { // TODO: Should we throw? Ignore? continue; } var scheme = dispatcher.BaseAddress?.Scheme; if (!"http".Equals(scheme, StringComparison.OrdinalIgnoreCase) && !"https".Equals(scheme, StringComparison.OrdinalIgnoreCase)) { continue; // Not an HTTP(S) dispatcher } bool matching = false; foreach (var serverAddress in serverAddresses.Addresses) { // TODO: Might not be necessary to compare paths var serverUri = new Uri(serverAddress); var serverAddressNormalized = string.Join(":", serverUri.GetComponents(UriComponents.Port | UriComponents.Path, UriFormat.SafeUnescaped)); var dispatcherAddressNormalized = string.Join(":", dispatcher.BaseAddress.GetComponents(UriComponents.Port | UriComponents.Path, UriFormat.SafeUnescaped)); if (dispatcherAddressNormalized.StartsWith(serverAddressNormalized, StringComparison.OrdinalIgnoreCase)) { matching = true; break; // Dispatcher address is based on server listening address; } } if (matching) { branchApp.Map(dispatcher.BaseAddress.AbsolutePath, wcfApp => { var servicesScopeFactory = wcfApp.ApplicationServices.GetRequiredService <IServiceScopeFactory>(); var requestHandler = new RequestDelegateHandler(dispatcher, servicesScopeFactory); if (requestHandler.WebSocketOptions != null) { wcfApp.UseWebSockets(requestHandler.WebSocketOptions); } wcfApp.Run(requestHandler.HandleRequest); }); } } } branchApp.Use(_ => { return(context => _next(context)); }); return(branchApp.Build()); }
public ServiceModelHttpMiddleware(RequestDelegate next, IApplicationBuilder app, IServiceBuilder serviceBuilder, IDispatcherBuilder dispatcherBuilder) { _serviceBuilder = serviceBuilder; _next = next; _branch = BuildBranch(app, _serviceBuilder, dispatcherBuilder); }
public TelegramBotDataBuilder UseDispatcherBuilder(IDispatcherBuilder builder) { _builder = builder; return(this); }
private RequestDelegate BuildBranch(IApplicationBuilder app, IServiceBuilder serviceBuilder, IDispatcherBuilder dispatcherBuilder) { _logger.LogDebug("Building branch map"); var branchApp = app.New(); var serverAddressesFeature = app.ServerFeatures.Get <IServerAddressesFeature>(); foreach (var address in serverAddressesFeature.Addresses) { _logger.LogDebug($"Adding base address {address} to serviceBuilder"); serviceBuilder.BaseAddresses.Add(new Uri(address)); } foreach (var serviceType in serviceBuilder.Services) { var dispatchers = dispatcherBuilder.BuildDispatchers(serviceType); foreach (var dispatcher in dispatchers) { if (dispatcher.BaseAddress == null) { // TODO: Should we throw? Ignore? continue; } var binding = dispatcher.Binding as CustomBinding; if (binding == null) { binding = new CustomBinding(dispatcher.Binding); } if (binding.Elements.Find <HttpTransportBindingElement>() == null) { _logger.LogDebug($"Binding for address {dispatcher.BaseAddress} is not an HTTP[S] binding ao skipping"); continue; // Not an HTTP(S) dispatcher } var parameters = new BindingParameterCollection(); parameters.Add(app); parameters.Add(serverAddressesFeature); Type supportedChannelType = null; IServiceDispatcher serviceDispatcher = null; var supportedChannels = dispatcher.SupportedChannelTypes; for (int i = 0; i < supportedChannels.Count; i++) { Type channelType = supportedChannels[i]; if (channelType == typeof(IInputChannel)) { if (binding.CanBuildServiceDispatcher <IInputChannel>(parameters)) { serviceDispatcher = binding.BuildServiceDispatcher <IInputChannel>(parameters, dispatcher); supportedChannelType = typeof(IInputChannel); break; } } if (channelType == typeof(IReplyChannel)) { if (binding.CanBuildServiceDispatcher <IReplyChannel>(parameters)) { serviceDispatcher = binding.BuildServiceDispatcher <IReplyChannel>(parameters, dispatcher); supportedChannelType = typeof(IReplyChannel); } } if (channelType == typeof(IDuplexChannel)) { if (binding.CanBuildServiceDispatcher <IDuplexChannel>(parameters)) { serviceDispatcher = binding.BuildServiceDispatcher <IDuplexChannel>(parameters, dispatcher); supportedChannelType = typeof(IDuplexChannel); } } if (channelType == typeof(IInputSessionChannel)) { if (binding.CanBuildServiceDispatcher <IInputSessionChannel>(parameters)) { serviceDispatcher = binding.BuildServiceDispatcher <IInputSessionChannel>(parameters, dispatcher); supportedChannelType = typeof(IInputSessionChannel); } } if (channelType == typeof(IReplySessionChannel)) { if (binding.CanBuildServiceDispatcher <IReplySessionChannel>(parameters)) { serviceDispatcher = binding.BuildServiceDispatcher <IReplySessionChannel>(parameters, dispatcher); supportedChannelType = typeof(IReplySessionChannel); } } if (channelType == typeof(IDuplexSessionChannel)) { if (binding.CanBuildServiceDispatcher <IDuplexSessionChannel>(parameters)) { serviceDispatcher = binding.BuildServiceDispatcher <IDuplexSessionChannel>(parameters, dispatcher); supportedChannelType = typeof(IDuplexSessionChannel); } } } _logger.LogInformation($"Mapping CoreWCF branch app for path {dispatcher.BaseAddress.AbsolutePath}"); branchApp.Map(dispatcher.BaseAddress.AbsolutePath, wcfApp => { var servicesScopeFactory = wcfApp.ApplicationServices.GetRequiredService <IServiceScopeFactory>(); var requestHandler = new RequestDelegateHandler(serviceDispatcher, servicesScopeFactory); if (requestHandler.WebSocketOptions != null) { wcfApp.UseWebSockets(requestHandler.WebSocketOptions); } wcfApp.Run(requestHandler.HandleRequest); }); } } branchApp.Use(_ => { return(reqContext => _next(reqContext)); }); return(branchApp.Build()); }
public TelegramBotData(ITelegramBotClient bot, IDispatcherBuilder dispatcherBuilder, string endpoint, string basePath, UserUpdate userUpdate) { SetupParameters(bot, dispatcherBuilder.SetTelegramBotData(this).Build(), endpoint, basePath, userUpdate); }