Skip to content

[SignalR] Move to generic host #22602

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Jun 23, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<Reference Include="Microsoft.Extensions.DependencyInjection" />
<Reference Include="Microsoft.Extensions.FileProviders.Physical" />
<Reference Include="Microsoft.Extensions.FileProviders.Composite" />
<Reference Include="Microsoft.Extensions.Hosting.Abstractions" />
<Reference Include="Microsoft.Extensions.Hosting" />
<Reference Include="Microsoft.Extensions.Logging" />
<Reference Include="Microsoft.Extensions.Options" />
</ItemGroup>
Expand Down
4 changes: 2 additions & 2 deletions src/Hosting/Hosting/src/Microsoft.AspNetCore.Hosting.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<Description>ASP.NET Core hosting infrastructure and startup logic for web applications.</Description>
Expand Down Expand Up @@ -26,7 +26,7 @@
<Reference Include="Microsoft.Extensions.DependencyInjection" />
<Reference Include="Microsoft.Extensions.FileProviders.Physical" />
<Reference Include="Microsoft.Extensions.FileProviders.Composite" />
<Reference Include="Microsoft.Extensions.Hosting.Abstractions" />
<Reference Include="Microsoft.Extensions.Hosting" />
<Reference Include="Microsoft.Extensions.Logging" />
<Reference Include="Microsoft.Extensions.Options" />

Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class HubProtocolVersionTests : FunctionalTestBase
[MemberData(nameof(TransportTypes))]
public async Task ClientUsingOldCallWithOriginalProtocol(HttpTransportType transportType)
{
using (var server = await StartServer<VersionStartup>())
await using (var server = await StartServer<VersionStartup>())
{
var connectionBuilder = new HubConnectionBuilder()
.WithLoggerFactory(LoggerFactory)
Expand Down Expand Up @@ -67,7 +67,7 @@ public async Task ClientUsingOldCallWithOriginalProtocol(HttpTransportType trans
[MemberData(nameof(TransportTypes))]
public async Task ClientUsingOldCallWithNewProtocol(HttpTransportType transportType)
{
using (var server = await StartServer<VersionStartup>())
await using (var server = await StartServer<VersionStartup>())
{
var connectionBuilder = new HubConnectionBuilder()
.WithLoggerFactory(LoggerFactory)
Expand Down Expand Up @@ -100,7 +100,7 @@ public async Task ClientUsingOldCallWithNewProtocol(HttpTransportType transportT
[MemberData(nameof(TransportTypes))]
public async Task ClientUsingNewCallWithNewProtocol(HttpTransportType transportType)
{
using (var server = await StartServer<VersionStartup>())
await using (var server = await StartServer<VersionStartup>())
{
var httpConnectionFactory = new HttpConnectionFactory(
Options.Create(new HttpConnectionOptions
Expand Down Expand Up @@ -166,7 +166,7 @@ bool ExpectedErrors(WriteContext writeContext)
return writeContext.LoggerName == typeof(HubConnection).FullName;
}

using (var server = await StartServer<VersionStartup>(ExpectedErrors))
await using (var server = await StartServer<VersionStartup>(ExpectedErrors))
{
var connectionBuilder = new HubConnectionBuilder()
.WithLoggerFactory(LoggerFactory)
Expand Down
104 changes: 55 additions & 49 deletions src/SignalR/clients/ts/FunctionalTests/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,17 @@
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Win32;

namespace FunctionalTests
{
public class Program
{
public static void Main(string[] args)
public static Task Main(string[] args)
{
string url = null;
for (var i = 0; i < args.Length; i++)
Expand All @@ -27,65 +29,69 @@ public static void Main(string[] args)
}
}

var hostBuilder = new WebHostBuilder()
.ConfigureLogging(factory =>
var hostBuilder = new HostBuilder()
.ConfigureWebHost(webHostBuilder =>
{
factory.AddConsole(options =>
webHostBuilder
.ConfigureLogging(factory =>
{
options.IncludeScopes = true;
options.TimestampFormat = "[HH:mm:ss] ";
options.UseUtcTimestamp = true;
});
factory.AddDebug();
factory.SetMinimumLevel(LogLevel.Debug);
})
.UseKestrel((builderContext, options) =>
{
options.ConfigureHttpsDefaults(httpsOptions =>
factory.AddConsole(options =>
{
options.IncludeScopes = true;
options.TimestampFormat = "[HH:mm:ss] ";
options.UseUtcTimestamp = true;
});
factory.AddDebug();
factory.SetMinimumLevel(LogLevel.Debug);
})
.UseKestrel((builderContext, options) =>
{
bool useRSA = false;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
options.ConfigureHttpsDefaults(httpsOptions =>
{
// Detect Win10+
var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
var major = key.GetValue("CurrentMajorVersionNumber") as int?;
var minor = key.GetValue("CurrentMinorVersionNumber") as int?;
bool useRSA = false;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
// Detect Win10+
var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
var major = key.GetValue("CurrentMajorVersionNumber") as int?;
var minor = key.GetValue("CurrentMinorVersionNumber") as int?;

if (major.HasValue && minor.HasValue)
if (major.HasValue && minor.HasValue)
{
useRSA = true;
}
}
else
{
useRSA = true;
}
}
else
{
useRSA = true;
}

if (useRSA)
{
// RSA cert, won't work on Windows 8.1 & Windows 2012 R2 using HTTP2, and ECC won't work in some Node environments
var certPath = Path.Combine(Directory.GetCurrentDirectory(), "testCert.pfx");
httpsOptions.ServerCertificate = new X509Certificate2(certPath, "testPassword");
}
else
{
// ECC cert, works on Windows 8.1 & Windows 2012 R2 using HTTP2
var certPath = Path.Combine(Directory.GetCurrentDirectory(), "testCertECC.pfx");
httpsOptions.ServerCertificate = new X509Certificate2(certPath, "testPassword");
}
});
})
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>();
if (useRSA)
{
// RSA cert, won't work on Windows 8.1 & Windows 2012 R2 using HTTP2, and ECC won't work in some Node environments
var certPath = Path.Combine(Directory.GetCurrentDirectory(), "testCert.pfx");
httpsOptions.ServerCertificate = new X509Certificate2(certPath, "testPassword");
}
else
{
// ECC cert, works on Windows 8.1 & Windows 2012 R2 using HTTP2
var certPath = Path.Combine(Directory.GetCurrentDirectory(), "testCertECC.pfx");
httpsOptions.ServerCertificate = new X509Certificate2(certPath, "testPassword");
}
});
})
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>();

if (!string.IsNullOrEmpty(url))
{
Console.WriteLine($"Forcing URL to: {url}");
hostBuilder.UseUrls(url);
}
if (!string.IsNullOrEmpty(url))
{
Console.WriteLine($"Forcing URL to: {url}");
webHostBuilder.UseUrls(url);
}
});

hostBuilder.Build().Run();
return hostBuilder.Build().RunAsync();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Cors.Infrastructure;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.SignalR.Tests;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Xunit;
using Xunit.Abstractions;
Expand Down Expand Up @@ -305,7 +307,7 @@ void ConfigureRoutes(IEndpointRouteBuilder endpoints)
[WebSocketsSupportedCondition]
public async Task MapConnectionHandlerWithWebSocketSubProtocolSetsProtocol()
{
var host = BuildWebHost<MyConnectionHandler>("/socket",
using var host = BuildWebHost<MyConnectionHandler>("/socket",
options => options.WebSockets.SubProtocolSelector = subprotocols =>
{
Assert.Equal(new[] { "protocol1", "protocol2" }, subprotocols.ToArray());
Expand All @@ -314,7 +316,7 @@ public async Task MapConnectionHandlerWithWebSocketSubProtocolSetsProtocol()

await host.StartAsync();

var feature = host.ServerFeatures.Get<IServerAddressesFeature>();
var feature = host.Services.GetService<IServer>().Features.Get<IServerAddressesFeature>();
var address = feature.Addresses.First().Replace("http", "ws") + "/socket";

var client = new ClientWebSocket();
Expand Down Expand Up @@ -377,44 +379,52 @@ public override Task OnConnectedAsync(ConnectionContext connection)
}
}

private IWebHost BuildWebHost(Action<IEndpointRouteBuilder> configure)
private IHost BuildWebHost(Action<IEndpointRouteBuilder> configure)
{
return new WebHostBuilder()
.UseKestrel()
.ConfigureServices(services =>
return new HostBuilder()
.ConfigureWebHost(webHostBuilder =>
{
services.AddConnections();
})
.Configure(app =>
{
app.UseRouting();
app.UseEndpoints(endpoints => configure(endpoints));
webHostBuilder
.UseKestrel()
.ConfigureServices(services =>
{
services.AddConnections();
})
.Configure(app =>
{
app.UseRouting();
app.UseEndpoints(endpoints => configure(endpoints));
})
.UseUrls("http://127.0.0.1:0");
})
.UseUrls("http://127.0.0.1:0")
.Build();
}

private IWebHost BuildWebHost<TConnectionHandler>(string path, Action<HttpConnectionDispatcherOptions> configureOptions) where TConnectionHandler : ConnectionHandler
private IHost BuildWebHost<TConnectionHandler>(string path, Action<HttpConnectionDispatcherOptions> configureOptions) where TConnectionHandler : ConnectionHandler
{
return new WebHostBuilder()
.UseUrls("http://127.0.0.1:0")
.UseKestrel()
.ConfigureServices(services =>
{
services.AddConnections();
})
.Configure(app =>
return new HostBuilder()
.ConfigureWebHost(webHostBuilder =>
{
app.UseRouting();
app.UseEndpoints(routes =>
webHostBuilder
.UseUrls("http://127.0.0.1:0")
.UseKestrel()
.ConfigureServices(services =>
{
services.AddConnections();
})
.Configure(app =>
{
app.UseRouting();
app.UseEndpoints(routes =>
{
routes.MapConnectionHandler<TConnectionHandler>(path, configureOptions);
});
})
.ConfigureLogging(factory =>
{
routes.MapConnectionHandler<TConnectionHandler>(path, configureOptions);
factory.AddXunit(_output, LogLevel.Trace);
});
})
.ConfigureLogging(factory =>
{
factory.AddXunit(_output, LogLevel.Trace);
})
.Build();
}
}
Expand Down
Loading