From 5102b25413a285fd5e2745fd47a6792d9560f165 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:27:52 +0000 Subject: [PATCH 01/22] Initial plan From 54f0cdd1299828500ed98faf951d857986fc24c5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 17 Jul 2025 18:42:29 +0000 Subject: [PATCH 02/22] Mark WebHostBuilder class as obsolete with placeholder message Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- src/Hosting/Hosting/src/WebHostBuilder.cs | 1 + .../Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj | 3 ++- .../TestHost/test/Microsoft.AspNetCore.TestHost.Tests.csproj | 2 ++ .../Microsoft.AspNetCore.Hosting.WindowsServices.Tests.csproj | 2 ++ .../IStartupInjectionAssemblyName.csproj | 2 ++ .../Microsoft.AspNetCore.Hosting.TestSites.csproj | 2 ++ 6 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Hosting/Hosting/src/WebHostBuilder.cs b/src/Hosting/Hosting/src/WebHostBuilder.cs index f21d3593697e..2a60026c3764 100644 --- a/src/Hosting/Hosting/src/WebHostBuilder.cs +++ b/src/Hosting/Hosting/src/WebHostBuilder.cs @@ -20,6 +20,7 @@ namespace Microsoft.AspNetCore.Hosting; /// /// A builder for /// +[Obsolete("TODO: Add Obsolete message")] public class WebHostBuilder : IWebHostBuilder { private readonly HostingEnvironment _hostingEnvironment; diff --git a/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj b/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj index 866a08e32b43..184049d4eaa4 100644 --- a/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj +++ b/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj @@ -3,7 +3,8 @@ $(DefaultNetCoreTargetFramework) - $(NoWarn);EXTEXP0003 + + $(NoWarn);EXTEXP0003;CS0618 diff --git a/src/Hosting/TestHost/test/Microsoft.AspNetCore.TestHost.Tests.csproj b/src/Hosting/TestHost/test/Microsoft.AspNetCore.TestHost.Tests.csproj index 820cf3800f65..cf06dfd99f93 100644 --- a/src/Hosting/TestHost/test/Microsoft.AspNetCore.TestHost.Tests.csproj +++ b/src/Hosting/TestHost/test/Microsoft.AspNetCore.TestHost.Tests.csproj @@ -2,6 +2,8 @@ $(DefaultNetCoreTargetFramework) + + $(NoWarn);CS0618 diff --git a/src/Hosting/WindowsServices/test/Microsoft.AspNetCore.Hosting.WindowsServices.Tests.csproj b/src/Hosting/WindowsServices/test/Microsoft.AspNetCore.Hosting.WindowsServices.Tests.csproj index 431869c11222..c61d39779f09 100644 --- a/src/Hosting/WindowsServices/test/Microsoft.AspNetCore.Hosting.WindowsServices.Tests.csproj +++ b/src/Hosting/WindowsServices/test/Microsoft.AspNetCore.Hosting.WindowsServices.Tests.csproj @@ -2,6 +2,8 @@ $(DefaultNetCoreTargetFramework) + + $(NoWarn);CS0618 diff --git a/src/Hosting/test/testassets/IStartupInjectionAssemblyName/IStartupInjectionAssemblyName.csproj b/src/Hosting/test/testassets/IStartupInjectionAssemblyName/IStartupInjectionAssemblyName.csproj index 71d8a7873ca5..9fded2eebdc3 100644 --- a/src/Hosting/test/testassets/IStartupInjectionAssemblyName/IStartupInjectionAssemblyName.csproj +++ b/src/Hosting/test/testassets/IStartupInjectionAssemblyName/IStartupInjectionAssemblyName.csproj @@ -3,6 +3,8 @@ $(DefaultNetCoreTargetFramework) Exe + + $(NoWarn);CS0618 diff --git a/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Microsoft.AspNetCore.Hosting.TestSites.csproj b/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Microsoft.AspNetCore.Hosting.TestSites.csproj index 64124387250e..56885418116e 100644 --- a/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Microsoft.AspNetCore.Hosting.TestSites.csproj +++ b/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Microsoft.AspNetCore.Hosting.TestSites.csproj @@ -3,6 +3,8 @@ $(DefaultNetCoreTargetFramework) Exe + + $(NoWarn);CS0618 From 8c3f586cb8cff48b90d372fef4b82671dfba4e18 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 17 Jul 2025 19:53:17 +0000 Subject: [PATCH 03/22] Update WebHostBuilder usage to HostBuilder pattern in four target files Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- .../HostingTests.cs | 8 +- .../testassets/InProcessWebSite/Program.cs | 86 +++++++++++------ .../Http3/Http3TlsTests.cs | 96 ++++++++++--------- .../ServerComparison.TestSites/Program.cs | 51 +++++----- 4 files changed, 141 insertions(+), 100 deletions(-) diff --git a/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs b/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs index 31f8626d1981..162af055b75d 100644 --- a/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs +++ b/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs @@ -25,8 +25,12 @@ public async Task WebhostLoadsKeyRingBeforeServerStarts() .Returns(Mock.Of()) .Callback(() => tcs.TrySetResult()); - var builder = new WebHostBuilder() - .UseStartup() + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseStartup(); + }) .ConfigureServices(s => s.AddDataProtection() .Services diff --git a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs index 8ae69750afc0..4f2fd4b1ccb9 100644 --- a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs +++ b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs @@ -56,9 +56,13 @@ public static int Main(string[] args) return 12; case "HangOnStop": { - var host = new WebHostBuilder() - .UseIIS() - .UseStartup() + var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseIIS() + .UseStartup(); + }) .Build(); host.Run(); @@ -67,10 +71,14 @@ public static int Main(string[] args) break; case "IncreaseShutdownLimit": { - var host = new WebHostBuilder() - .UseIIS() - .UseShutdownTimeout(TimeSpan.FromSeconds(120)) - .UseStartup() + var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseIIS() + .UseShutdownTimeout(TimeSpan.FromSeconds(120)) + .UseStartup(); + }) .Build(); host.Run(); @@ -94,11 +102,15 @@ public static int Main(string[] args) return 0; case "OverriddenServer": { - var host = new WebHostBuilder() - .UseIIS() - .ConfigureServices(services => services.AddSingleton()) - .Configure(builder => builder.Run(async context => { await context.Response.WriteAsync("I shouldn't work"); })) - .Build(); + var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseIIS() + .ConfigureServices(services => services.AddSingleton()) + .Configure(builder => builder.Run(async context => { await context.Response.WriteAsync("I shouldn't work"); })); + }) + .Build(); host.Run(); } break; @@ -111,18 +123,22 @@ public static int Main(string[] args) #if !FORWARDCOMPAT case "DecreaseRequestLimit": { - var host = new WebHostBuilder() + var host = new HostBuilder() .ConfigureLogging((_, factory) => { factory.AddConsole(); factory.AddFilter("Console", level => level >= LogLevel.Information); }) - .UseIIS() - .ConfigureServices(services => + .ConfigureWebHost(webHostBuilder => { - services.Configure(options => options.MaxRequestBodySize = 2); + webHostBuilder + .UseIIS() + .ConfigureServices(services => + { + services.Configure(options => options.MaxRequestBodySize = 2); + }) + .UseStartup(); }) - .UseStartup() .Build(); host.Run(); @@ -131,15 +147,19 @@ public static int Main(string[] args) #endif case "ThrowInStartup": { - var host = new WebHostBuilder() - .ConfigureLogging((_, factory) => - { - factory.AddConsole(); - factory.AddFilter("Console", level => level >= LogLevel.Information); - }) - .UseIIS() - .UseStartup() - .Build(); + var host = new HostBuilder() + .ConfigureLogging((_, factory) => + { + factory.AddConsole(); + factory.AddFilter("Console", level => level >= LogLevel.Information); + }) + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseIIS() + .UseStartup(); + }) + .Build(); host.Run(); } @@ -189,16 +209,20 @@ public static int Main(string[] args) private static int StartServer() { - var host = new WebHostBuilder() + var host = new HostBuilder() .ConfigureLogging((_, factory) => { factory.AddConsole(); factory.AddFilter("Console", level => level >= LogLevel.Information); }) - .UseKestrel() - .UseIIS() - .UseIISIntegration() - .UseStartup() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrel() + .UseIIS() + .UseIISIntegration() + .UseStartup(); + }) .Build(); host.Run(); diff --git a/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3TlsTests.cs b/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3TlsTests.cs index 78279c042bf7..ac66ad3a72ed 100644 --- a/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3TlsTests.cs +++ b/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3TlsTests.cs @@ -345,39 +345,43 @@ public async Task TlsHandshakeCallbackOptions_Invoked() [InlineData(false, false, false)] public async Task UseKestrelCore_CodeBased(bool useQuic, bool useHttps, bool useHttpsEnablesHttpsConfiguration) { - var hostBuilder = new WebHostBuilder() - .UseKestrelCore() - .ConfigureKestrel(serverOptions => - { - serverOptions.ListenAnyIP(0, listenOptions => + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrelCore() + .ConfigureKestrel(serverOptions => { - listenOptions.Protocols = HttpProtocols.Http3; - if (useHttps) + serverOptions.ListenAnyIP(0, listenOptions => { - if (useHttpsEnablesHttpsConfiguration) + listenOptions.Protocols = HttpProtocols.Http3; + if (useHttps) { - listenOptions.UseHttps(httpsOptions => + if (useHttpsEnablesHttpsConfiguration) { - httpsOptions.ServerCertificate = TestResources.GetTestCertificate(); - }); - } - else - { - // Specifically choose an overload that doesn't enable https configuration - listenOptions.UseHttps(new HttpsConnectionAdapterOptions + listenOptions.UseHttps(httpsOptions => + { + httpsOptions.ServerCertificate = TestResources.GetTestCertificate(); + }); + } + else { - ServerCertificate = TestResources.GetTestCertificate() - }); + // Specifically choose an overload that doesn't enable https configuration + listenOptions.UseHttps(new HttpsConnectionAdapterOptions + { + ServerCertificate = TestResources.GetTestCertificate() + }); + } } - } - }); - }) - .Configure(app => { }); + }); + }) + .Configure(app => { }); - if (useQuic) - { - hostBuilder.UseQuic(); - } + if (useQuic) + { + webHostBuilder.UseQuic(); + } + }); var host = hostBuilder.Build(); @@ -400,25 +404,29 @@ public async Task UseKestrelCore_CodeBased(bool useQuic, bool useHttps, bool use [InlineData(false)] public void UseKestrelCore_ConfigurationBased(bool useQuic) { - var hostBuilder = new WebHostBuilder() - .UseKestrelCore() - .ConfigureKestrel(serverOptions => - { - var config = new ConfigurationBuilder().AddInMemoryCollection(new[] + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrelCore() + .ConfigureKestrel(serverOptions => { - new KeyValuePair("Endpoints:end1:Url", "https://127.0.0.1:0"), - new KeyValuePair("Endpoints:end1:Protocols", "Http3"), - new KeyValuePair("Certificates:Default:Path", Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx")), - new KeyValuePair("Certificates:Default:Password", "testPassword"), - }).Build(); - serverOptions.Configure(config); - }) - .Configure(app => { }); - - if (useQuic) - { - hostBuilder.UseQuic(); - } + var config = new ConfigurationBuilder().AddInMemoryCollection(new[] + { + new KeyValuePair("Endpoints:end1:Url", "https://127.0.0.1:0"), + new KeyValuePair("Endpoints:end1:Protocols", "Http3"), + new KeyValuePair("Certificates:Default:Path", Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx")), + new KeyValuePair("Certificates:Default:Password", "testPassword"), + }).Build(); + serverOptions.Configure(config); + }) + .Configure(app => { }); + + if (useQuic) + { + webHostBuilder.UseQuic(); + } + }); var host = hostBuilder.Build(); diff --git a/src/Servers/testassets/ServerComparison.TestSites/Program.cs b/src/Servers/testassets/ServerComparison.TestSites/Program.cs index aa623fb9cd33..f674e5122eee 100644 --- a/src/Servers/testassets/ServerComparison.TestSites/Program.cs +++ b/src/Servers/testassets/ServerComparison.TestSites/Program.cs @@ -13,38 +13,43 @@ public static class Program { public static void Main(string[] args) { - var builder = new WebHostBuilder() - .UseConfiguration(new ConfigurationBuilder() - .AddCommandLine(args) - .Build()) + var configuration = new ConfigurationBuilder() + .AddCommandLine(args) + .Build(); + + var builder = new HostBuilder() + .UseConfiguration(configuration) .ConfigureLogging((_, factory) => { factory.AddConsole(); factory.AddFilter("Console", level => level >= LogLevel.Warning); }) - .UseStartup("ServerComparison.TestSites"); - - builder.UseKestrel(); - builder.UseIISIntegration(); - builder.UseIIS(); - - // Switch between Kestrel, IIS, and HttpSys for different tests. Default to Kestrel for normal app execution. - if (string.Equals(builder.GetSetting("server"), "Microsoft.AspNetCore.Server.HttpSys", StringComparison.OrdinalIgnoreCase)) - { - builder.UseHttpSys(options => + .ConfigureWebHost(webHostBuilder => { - if (string.Equals(builder.GetSetting("environment") ?? - Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"), - "NtlmAuthentication", StringComparison.OrdinalIgnoreCase)) + webHostBuilder + .UseStartup("ServerComparison.TestSites") + .UseKestrel() + .UseIISIntegration() + .UseIIS(); + + // Switch between Kestrel, IIS, and HttpSys for different tests. Default to Kestrel for normal app execution. + if (string.Equals(configuration["server"], "Microsoft.AspNetCore.Server.HttpSys", StringComparison.OrdinalIgnoreCase)) { - // Set up NTLM authentication for HttpSys as follows. - // For IIS and IISExpress use inetmgr to setup NTLM authentication on the application or - // modify the applicationHost.config to enable NTLM. - options.Authentication.AllowAnonymous = true; - options.Authentication.Schemes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.NTLM; + webHostBuilder.UseHttpSys(options => + { + if (string.Equals(configuration["environment"] ?? + Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"), + "NtlmAuthentication", StringComparison.OrdinalIgnoreCase)) + { + // Set up NTLM authentication for HttpSys as follows. + // For IIS and IISExpress use inetmgr to setup NTLM authentication on the application or + // modify the applicationHost.config to enable NTLM. + options.Authentication.AllowAnonymous = true; + options.Authentication.Schemes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.NTLM; + } + }); } }); - } var host = builder.Build(); From 886920854730c8b7a9ce7a8c62553ef9cb339bea Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 17 Jul 2025 14:17:17 -0700 Subject: [PATCH 04/22] fixup --- .../test/Microsoft.AspNetCore.Hosting.Tests.csproj | 3 +-- src/Hosting/Hosting/test/WebHostBuilderTests.cs | 9 +++++++++ src/Hosting/Hosting/test/WebHostTests.cs | 2 ++ .../testassets/ServerComparison.TestSites/Program.cs | 3 ++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj b/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj index 184049d4eaa4..866a08e32b43 100644 --- a/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj +++ b/src/Hosting/Hosting/test/Microsoft.AspNetCore.Hosting.Tests.csproj @@ -3,8 +3,7 @@ $(DefaultNetCoreTargetFramework) - - $(NoWarn);EXTEXP0003;CS0618 + $(NoWarn);EXTEXP0003 diff --git a/src/Hosting/Hosting/test/WebHostBuilderTests.cs b/src/Hosting/Hosting/test/WebHostBuilderTests.cs index caf6d2a6958f..f29d2f4570b7 100644 --- a/src/Hosting/Hosting/test/WebHostBuilderTests.cs +++ b/src/Hosting/Hosting/test/WebHostBuilderTests.cs @@ -429,6 +429,7 @@ public void DoNotCaptureStartupErrorsByDefault(IWebHostBuilder builder) public void ServiceProviderDisposedOnBuildException() { var service = new DisposableService(); +#pragma warning disable CS0618 // Type or member is obsolete var hostBuilder = new WebHostBuilder() .UseServer(new TestServer()) .ConfigureServices(services => @@ -437,6 +438,7 @@ public void ServiceProviderDisposedOnBuildException() services.AddSingleton(sp => service); }) .UseStartup(); +#pragma warning restore CS0618 // Type or member is obsolete Assert.Throws(() => hostBuilder.Build()); Assert.True(service.Disposed); @@ -1483,14 +1485,18 @@ private IWebHostBuilder CreateWebHostBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); +#pragma warning disable CS0618 // Type or member is obsolete return new WebHostBuilder().UseConfiguration(config); +#pragma warning restore CS0618 // Type or member is obsolete } +#pragma warning disable CS0618 // Type or member is obsolete public static TheoryData DefaultWebHostBuilders => new TheoryData { new WebHostBuilder(), new GenericWebHostBuilderWrapper(new HostBuilder()) }; +#pragma warning restore CS0618 // Type or member is obsolete public static TheoryData DefaultWebHostBuildersWithConfig { @@ -1506,10 +1512,12 @@ public static TheoryData DefaultWebHostBuildersWithConfig .AddInMemoryCollection(vals); var config = builder.Build(); +#pragma warning disable CS0618 // Type or member is obsolete return new TheoryData { new WebHostBuilder().UseConfiguration(config), new GenericWebHostBuilderWrapper(new HostBuilder()).UseConfiguration(config) }; +#pragma warning restore CS0618 // Type or member is obsolete } } @@ -1783,3 +1791,4 @@ public void Dispose() public void AddProvider(ILoggerProvider provider) { } } } +//#pragma warning restore CS0618 // Type or member is obsolete diff --git a/src/Hosting/Hosting/test/WebHostTests.cs b/src/Hosting/Hosting/test/WebHostTests.cs index a6114d47f027..cae78cb63c10 100644 --- a/src/Hosting/Hosting/test/WebHostTests.cs +++ b/src/Hosting/Hosting/test/WebHostTests.cs @@ -1103,7 +1103,9 @@ private IWebHost CreateHost(RequestDelegate requestDelegate) private IWebHostBuilder CreateBuilder(IConfiguration config = null) { +#pragma warning disable CS0618 // Type or member is obsolete return new WebHostBuilder().UseConfiguration(config ?? new ConfigurationBuilder().Build()).UseStartup("Microsoft.AspNetCore.Hosting.Tests"); +#pragma warning restore CS0618 // Type or member is obsolete } private static bool[] RegisterCallbacksThatThrow(IServiceCollection services) diff --git a/src/Servers/testassets/ServerComparison.TestSites/Program.cs b/src/Servers/testassets/ServerComparison.TestSites/Program.cs index f674e5122eee..5af832b70304 100644 --- a/src/Servers/testassets/ServerComparison.TestSites/Program.cs +++ b/src/Servers/testassets/ServerComparison.TestSites/Program.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Server.HttpSys; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace ServerComparison.TestSites; @@ -18,7 +19,6 @@ public static void Main(string[] args) .Build(); var builder = new HostBuilder() - .UseConfiguration(configuration) .ConfigureLogging((_, factory) => { factory.AddConsole(); @@ -27,6 +27,7 @@ public static void Main(string[] args) .ConfigureWebHost(webHostBuilder => { webHostBuilder + .UseConfiguration(configuration) .UseStartup("ServerComparison.TestSites") .UseKestrel() .UseIISIntegration() From 5407fb0058eb79e5ef386452f8dc8c4860600807 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 17 Jul 2025 21:57:45 +0000 Subject: [PATCH 05/22] Address review feedback: Add pragma disables and update to HostBuilder pattern Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- src/Hosting/Hosting/src/WebHostBuilder.cs | 2 + .../samples/IdentitySample.Mvc/Program.cs | 20 ++- .../testassets/InProcessWebSite/Program.cs | 98 ++++++------ .../WebHostBuilderKestrelExtensionsTests.cs | 141 ++++++++++++------ 4 files changed, 154 insertions(+), 107 deletions(-) diff --git a/src/Hosting/Hosting/src/WebHostBuilder.cs b/src/Hosting/Hosting/src/WebHostBuilder.cs index 2a60026c3764..4f5cd937f725 100644 --- a/src/Hosting/Hosting/src/WebHostBuilder.cs +++ b/src/Hosting/Hosting/src/WebHostBuilder.cs @@ -20,7 +20,9 @@ namespace Microsoft.AspNetCore.Hosting; /// /// A builder for /// +#pragma warning disable CS0618 // Type or member is obsolete [Obsolete("TODO: Add Obsolete message")] +#pragma warning restore CS0618 // Type or member is obsolete public class WebHostBuilder : IWebHostBuilder { private readonly HostingEnvironment _hostingEnvironment; diff --git a/src/Identity/samples/IdentitySample.Mvc/Program.cs b/src/Identity/samples/IdentitySample.Mvc/Program.cs index a8c1e8cb5661..1cfe3c78f5dc 100644 --- a/src/Identity/samples/IdentitySample.Mvc/Program.cs +++ b/src/Identity/samples/IdentitySample.Mvc/Program.cs @@ -1,6 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.IO; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + namespace IdentitySample; public static class Program @@ -12,10 +16,14 @@ public static void Main(string[] args) host.Run(); } - public static IWebHostBuilder CreateHostBuilder(string[] args) => - new WebHostBuilder() - .UseKestrel() - .UseContentRoot(Directory.GetCurrentDirectory()) - .UseIISIntegration() - .UseStartup(); + public static IHostBuilder CreateHostBuilder(string[] args) => + new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrel() + .UseContentRoot(Directory.GetCurrentDirectory()) + .UseIISIntegration() + .UseStartup(); + }); } diff --git a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs index 4f2fd4b1ccb9..8b02a3a902b8 100644 --- a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs +++ b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs @@ -56,14 +56,12 @@ public static int Main(string[] args) return 12; case "HangOnStop": { - var host = new HostBuilder() - .ConfigureWebHost(webHostBuilder => - { - webHostBuilder - .UseIIS() - .UseStartup(); - }) +#pragma warning disable CS0618 // Type or member is obsolete + var host = new WebHostBuilder() + .UseIIS() + .UseStartup() .Build(); +#pragma warning restore CS0618 // Type or member is obsolete host.Run(); Thread.Sleep(Timeout.Infinite); @@ -71,15 +69,13 @@ public static int Main(string[] args) break; case "IncreaseShutdownLimit": { - var host = new HostBuilder() - .ConfigureWebHost(webHostBuilder => - { - webHostBuilder - .UseIIS() - .UseShutdownTimeout(TimeSpan.FromSeconds(120)) - .UseStartup(); - }) +#pragma warning disable CS0618 // Type or member is obsolete + var host = new WebHostBuilder() + .UseIIS() + .UseShutdownTimeout(TimeSpan.FromSeconds(120)) + .UseStartup() .Build(); +#pragma warning restore CS0618 // Type or member is obsolete host.Run(); } @@ -102,15 +98,13 @@ public static int Main(string[] args) return 0; case "OverriddenServer": { - var host = new HostBuilder() - .ConfigureWebHost(webHostBuilder => - { - webHostBuilder - .UseIIS() - .ConfigureServices(services => services.AddSingleton()) - .Configure(builder => builder.Run(async context => { await context.Response.WriteAsync("I shouldn't work"); })); - }) - .Build(); +#pragma warning disable CS0618 // Type or member is obsolete + var host = new WebHostBuilder() + .UseIIS() + .ConfigureServices(services => services.AddSingleton()) + .Configure(builder => builder.Run(async context => { await context.Response.WriteAsync("I shouldn't work"); })) + .Build(); +#pragma warning restore CS0618 // Type or member is obsolete host.Run(); } break; @@ -123,23 +117,21 @@ public static int Main(string[] args) #if !FORWARDCOMPAT case "DecreaseRequestLimit": { - var host = new HostBuilder() +#pragma warning disable CS0618 // Type or member is obsolete + var host = new WebHostBuilder() .ConfigureLogging((_, factory) => { factory.AddConsole(); factory.AddFilter("Console", level => level >= LogLevel.Information); }) - .ConfigureWebHost(webHostBuilder => + .UseIIS() + .ConfigureServices(services => { - webHostBuilder - .UseIIS() - .ConfigureServices(services => - { - services.Configure(options => options.MaxRequestBodySize = 2); - }) - .UseStartup(); + services.Configure(options => options.MaxRequestBodySize = 2); }) + .UseStartup() .Build(); +#pragma warning restore CS0618 // Type or member is obsolete host.Run(); break; @@ -147,19 +139,17 @@ public static int Main(string[] args) #endif case "ThrowInStartup": { - var host = new HostBuilder() - .ConfigureLogging((_, factory) => - { - factory.AddConsole(); - factory.AddFilter("Console", level => level >= LogLevel.Information); - }) - .ConfigureWebHost(webHostBuilder => - { - webHostBuilder - .UseIIS() - .UseStartup(); - }) - .Build(); +#pragma warning disable CS0618 // Type or member is obsolete + var host = new WebHostBuilder() + .ConfigureLogging((_, factory) => + { + factory.AddConsole(); + factory.AddFilter("Console", level => level >= LogLevel.Information); + }) + .UseIIS() + .UseStartup() + .Build(); +#pragma warning restore CS0618 // Type or member is obsolete host.Run(); } @@ -209,21 +199,19 @@ public static int Main(string[] args) private static int StartServer() { - var host = new HostBuilder() +#pragma warning disable CS0618 // Type or member is obsolete + var host = new WebHostBuilder() .ConfigureLogging((_, factory) => { factory.AddConsole(); factory.AddFilter("Console", level => level >= LogLevel.Information); }) - .ConfigureWebHost(webHostBuilder => - { - webHostBuilder - .UseKestrel() - .UseIIS() - .UseIISIntegration() - .UseStartup(); - }) + .UseKestrel() + .UseIIS() + .UseIISIntegration() + .UseStartup() .Build(); +#pragma warning restore CS0618 // Type or member is obsolete host.Run(); return 0; diff --git a/src/Servers/Kestrel/Kestrel/test/WebHostBuilderKestrelExtensionsTests.cs b/src/Servers/Kestrel/Kestrel/test/WebHostBuilderKestrelExtensionsTests.cs index 26a33f387764..4de3accacb7e 100644 --- a/src/Servers/Kestrel/Kestrel/test/WebHostBuilderKestrelExtensionsTests.cs +++ b/src/Servers/Kestrel/Kestrel/test/WebHostBuilderKestrelExtensionsTests.cs @@ -16,6 +16,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes.Internal; using Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; namespace Microsoft.AspNetCore.Server.Kestrel.Tests; @@ -26,9 +27,13 @@ public class WebHostBuilderKestrelExtensionsTests public void ApplicationServicesNotNullAfterUseKestrelWithoutOptions() { // Arrange - var hostBuilder = new WebHostBuilder() - .UseKestrel() - .Configure(app => { }); + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrel() + .Configure(app => { }); + }); hostBuilder.ConfigureServices(services => { @@ -47,13 +52,17 @@ public void ApplicationServicesNotNullAfterUseKestrelWithoutOptions() public void ApplicationServicesNotNullDuringUseKestrelWithOptions() { // Arrange - var hostBuilder = new WebHostBuilder() - .UseKestrel(options => + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - // Assert - Assert.NotNull(options.ApplicationServices); - }) - .Configure(app => { }); + webHostBuilder + .UseKestrel(options => + { + // Assert + Assert.NotNull(options.ApplicationServices); + }) + .Configure(app => { }); + }); // Act hostBuilder.Build(); @@ -62,9 +71,13 @@ public void ApplicationServicesNotNullDuringUseKestrelWithOptions() [Fact] public void DefaultTransportFactoriesConfigured() { - var hostBuilder = new WebHostBuilder() - .UseKestrel() - .Configure(app => { }); + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrel() + .Configure(app => { }); + }); var transportFactories = hostBuilder.Build().Services.GetServices(); @@ -84,18 +97,26 @@ public void DefaultTransportFactoriesConfigured() [Fact] public void SocketsTransportCanBeManuallySelectedIndependentOfOrder() { - var hostBuilder = new WebHostBuilder() - .UseKestrel() - .UseSockets() - .Configure(app => { }); + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrel() + .UseSockets() + .Configure(app => { }); + }); var factories = hostBuilder.Build().Services.GetServices(); AssertContainsType(factories); - var hostBuilderReversed = new WebHostBuilder() - .UseSockets() - .UseKestrel() - .Configure(app => { }); + var hostBuilderReversed = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseSockets() + .UseKestrel() + .Configure(app => { }); + }); var factoriesReversed = hostBuilderReversed.Build().Services.GetServices(); AssertContainsType(factoriesReversed); @@ -109,10 +130,14 @@ static void AssertContainsType(IEnumerable [Fact] public void ServerIsKestrelServerImpl() { - var hostBuilder = new WebHostBuilder() - .UseSockets() - .UseKestrel() - .Configure(app => { }); + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseSockets() + .UseKestrel() + .Configure(app => { }); + }); var server = Assert.IsType(hostBuilder.Build().Services.GetService()); @@ -140,10 +165,14 @@ public void ServerIsKestrelServerImpl() [Fact] public void MemoryPoolFactorySetCorrectlyWithSockets() { - var hostBuilder = new WebHostBuilder() - .UseSockets() - .UseKestrel() - .Configure(app => { }); + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseSockets() + .UseKestrel() + .Configure(app => { }); + }); var host = hostBuilder.Build(); @@ -153,10 +182,14 @@ public void MemoryPoolFactorySetCorrectlyWithSockets() Assert.Same(memoryPoolFactory, host.Services.GetRequiredService>().Value.MemoryPoolFactory); // Swap order of UseKestrel and UseSockets - hostBuilder = new WebHostBuilder() - .UseKestrel() - .UseSockets() - .Configure(app => { }); + hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrel() + .UseSockets() + .Configure(app => { }); + }); host = hostBuilder.Build(); @@ -169,9 +202,13 @@ public void MemoryPoolFactorySetCorrectlyWithSockets() [Fact] public void SocketsHasDefaultMemoryPool() { - var hostBuilder = new WebHostBuilder() - .UseSockets() - .Configure(app => { }); + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseSockets() + .Configure(app => { }); + }); var host = hostBuilder.Build(); @@ -186,10 +223,14 @@ public void SocketsHasDefaultMemoryPool() [NamedPipesSupported] public void MemoryPoolFactorySetCorrectlyWithNamedPipes() { - var hostBuilder = new WebHostBuilder() - .UseNamedPipes() - .UseKestrel() - .Configure(app => { }); + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseNamedPipes() + .UseKestrel() + .Configure(app => { }); + }); var host = hostBuilder.Build(); @@ -199,10 +240,14 @@ public void MemoryPoolFactorySetCorrectlyWithNamedPipes() Assert.Same(memoryPoolFactory, host.Services.GetRequiredService>().Value.MemoryPoolFactory); // Swap order of UseKestrel and UseNamedPipes - hostBuilder = new WebHostBuilder() - .UseKestrel() - .UseNamedPipes() - .Configure(app => { }); + hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrel() + .UseNamedPipes() + .Configure(app => { }); + }); host = hostBuilder.Build(); @@ -216,9 +261,13 @@ public void MemoryPoolFactorySetCorrectlyWithNamedPipes() [NamedPipesSupported] public void NamedPipesHasDefaultMemoryPool() { - var hostBuilder = new WebHostBuilder() - .UseNamedPipes() - .Configure(app => { }); + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseNamedPipes() + .Configure(app => { }); + }); var host = hostBuilder.Build(); From dd80d9cbf9bdd426d55edb24eec5446b890c268e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 17 Jul 2025 22:18:33 +0000 Subject: [PATCH 06/22] Add pragma warning suppression for WebHost.cs and remove from WebHostBuilder.cs Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- src/DefaultBuilder/src/WebHost.cs | 2 ++ src/Hosting/Hosting/src/WebHostBuilder.cs | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DefaultBuilder/src/WebHost.cs b/src/DefaultBuilder/src/WebHost.cs index a3e8b030d4c0..d1c8ab15a03a 100644 --- a/src/DefaultBuilder/src/WebHost.cs +++ b/src/DefaultBuilder/src/WebHost.cs @@ -154,7 +154,9 @@ public static IWebHostBuilder CreateDefaultBuilder() => /// The initialized . public static IWebHostBuilder CreateDefaultBuilder(string[] args) { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder(); +#pragma warning restore CS0618 // Type or member is obsolete if (string.IsNullOrEmpty(builder.GetSetting(WebHostDefaults.ContentRootKey))) { diff --git a/src/Hosting/Hosting/src/WebHostBuilder.cs b/src/Hosting/Hosting/src/WebHostBuilder.cs index 4f5cd937f725..2a60026c3764 100644 --- a/src/Hosting/Hosting/src/WebHostBuilder.cs +++ b/src/Hosting/Hosting/src/WebHostBuilder.cs @@ -20,9 +20,7 @@ namespace Microsoft.AspNetCore.Hosting; /// /// A builder for /// -#pragma warning disable CS0618 // Type or member is obsolete [Obsolete("TODO: Add Obsolete message")] -#pragma warning restore CS0618 // Type or member is obsolete public class WebHostBuilder : IWebHostBuilder { private readonly HostingEnvironment _hostingEnvironment; From 3f16853dad14ddc67f5aa5d8b1f9173a2272a234 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 17 Jul 2025 22:56:37 +0000 Subject: [PATCH 07/22] Update TestServerTests.cs and HttpsConfigurationTests.cs to use HostBuilder pattern Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- .../Kestrel/test/HttpsConfigurationTests.cs | 219 ++++++++++-------- .../Client/test/UnitTests/TestServerTests.cs | 73 +++--- 2 files changed, 171 insertions(+), 121 deletions(-) diff --git a/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs b/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs index cb27ce5bc210..8ebe671fe0f1 100644 --- a/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs +++ b/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs @@ -4,11 +4,13 @@ using System.Security.Cryptography.X509Certificates; using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Hosting.Server; using Microsoft.AspNetCore.Hosting.Server.Features; using Microsoft.AspNetCore.Server.Kestrel.Core; using Microsoft.AspNetCore.Server.Kestrel.Https; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; namespace Microsoft.AspNetCore.Server.Kestrel.Tests; @@ -21,25 +23,29 @@ public class HttpsConfigurationTests [InlineData("https://127.0.0.1:0", false)] public async Task BindAddressFromSetting(string address, bool useKestrelHttpsConfiguration) { - var hostBuilder = new WebHostBuilder() - .UseKestrelCore() - .ConfigureKestrel(serverOptions => - { - serverOptions.TestOverrideDefaultCertificate = new X509Certificate2(Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx"), "testPassword"); - }) - .Configure(app => { }); - - // This is what ASPNETCORE_URLS would populate - hostBuilder.UseSetting(WebHostDefaults.ServerUrlsKey, address); + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrelCore() + .ConfigureKestrel(serverOptions => + { + serverOptions.TestOverrideDefaultCertificate = new X509Certificate2(Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx"), "testPassword"); + }) + .Configure(app => { }) + // This is what ASPNETCORE_URLS would populate + .UseSetting(WebHostDefaults.ServerUrlsKey, address); - if (useKestrelHttpsConfiguration) - { - hostBuilder.UseKestrelHttpsConfiguration(); - } + if (useKestrelHttpsConfiguration) + { + webHostBuilder.UseKestrelHttpsConfiguration(); + } + }); var host = hostBuilder.Build(); + await host.StartAsync(); - Assert.Single(host.ServerFeatures.Get().Addresses, address); + Assert.Single(host.Services.GetRequiredService().Features.Get().Addresses, address); if (address.StartsWith("https", StringComparison.OrdinalIgnoreCase) && !useKestrelHttpsConfiguration) { @@ -47,8 +53,7 @@ public async Task BindAddressFromSetting(string address, bool useKestrelHttpsCon } else { - // Binding succeeds - await host.StartAsync(); + // Binding succeeds - server is already started, so we just stop it await host.StopAsync(); } } @@ -59,16 +64,20 @@ public void NoFallbackToHttpAddress() const string httpAddress = "http://127.0.0.1:0"; const string httpsAddress = "https://localhost:5001"; - var hostBuilder = new WebHostBuilder() - .UseKestrelCore() - .Configure(app => { }); - - // This is what ASPNETCORE_URLS would populate - hostBuilder.UseSetting(WebHostDefaults.ServerUrlsKey, $"{httpAddress};{httpsAddress}"); + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrelCore() + .Configure(app => { }) + // This is what ASPNETCORE_URLS would populate + .UseSetting(WebHostDefaults.ServerUrlsKey, $"{httpAddress};{httpsAddress}"); + }); var host = hostBuilder.Build(); + await host.StartAsync(); - Assert.Equal(new[] { httpAddress, httpsAddress }, host.ServerFeatures.Get().Addresses); + Assert.Equal(new[] { httpAddress, httpsAddress }, host.Services.GetRequiredService().Features.Get().Addresses); Assert.Throws(host.Run); } @@ -80,24 +89,28 @@ public void NoFallbackToHttpAddress() [InlineData("https://127.0.0.1:0", false)] public async Task BindAddressFromEndpoint(string address, bool useKestrelHttpsConfiguration) { - var hostBuilder = new WebHostBuilder() - .UseKestrelCore() - .ConfigureKestrel(serverOptions => - { - var config = new ConfigurationBuilder().AddInMemoryCollection(new[] + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrelCore() + .ConfigureKestrel(serverOptions => { - new KeyValuePair("Endpoints:end1:Url", address), - new KeyValuePair("Certificates:Default:Path", Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx")), - new KeyValuePair("Certificates:Default:Password", "testPassword"), - }).Build(); - serverOptions.Configure(config); - }) - .Configure(app => { }); - - if (useKestrelHttpsConfiguration) - { - hostBuilder.UseKestrelHttpsConfiguration(); - } + var config = new ConfigurationBuilder().AddInMemoryCollection(new[] + { + new KeyValuePair("Endpoints:end1:Url", address), + new KeyValuePair("Certificates:Default:Path", Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx")), + new KeyValuePair("Certificates:Default:Password", "testPassword"), + }).Build(); + serverOptions.Configure(config); + }) + .Configure(app => { }); + + if (useKestrelHttpsConfiguration) + { + webHostBuilder.UseKestrelHttpsConfiguration(); + } + }); var host = hostBuilder.Build(); @@ -118,23 +131,27 @@ public async Task BindAddressFromEndpoint(string address, bool useKestrelHttpsCo [InlineData(false)] public async Task LoadDefaultCertificate(bool useKestrelHttpsConfiguration) { - var hostBuilder = new WebHostBuilder() - .UseKestrelCore() - .ConfigureKestrel(serverOptions => - { - var config = new ConfigurationBuilder().AddInMemoryCollection(new[] + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrelCore() + .ConfigureKestrel(serverOptions => { - new KeyValuePair("Certificates:Default:Path", Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx")), - new KeyValuePair("Certificates:Default:Password", "testPassword"), - }).Build(); - serverOptions.Configure(config); - }) - .Configure(app => { }); - - if (useKestrelHttpsConfiguration) - { - hostBuilder.UseKestrelHttpsConfiguration(); - } + var config = new ConfigurationBuilder().AddInMemoryCollection(new[] + { + new KeyValuePair("Certificates:Default:Path", Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx")), + new KeyValuePair("Certificates:Default:Password", "testPassword"), + }).Build(); + serverOptions.Configure(config); + }) + .Configure(app => { }); + + if (useKestrelHttpsConfiguration) + { + webHostBuilder.UseKestrelHttpsConfiguration(); + } + }); var host = hostBuilder.Build(); @@ -150,24 +167,28 @@ public async Task LoadDefaultCertificate(bool useKestrelHttpsConfiguration) [InlineData("https://127.0.0.1:0", false)] public async Task LoadEndpointCertificate(string address, bool useKestrelHttpsConfiguration) { - var hostBuilder = new WebHostBuilder() - .UseKestrelCore() - .ConfigureKestrel(serverOptions => - { - var config = new ConfigurationBuilder().AddInMemoryCollection(new[] + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseKestrelCore() + .ConfigureKestrel(serverOptions => { - new KeyValuePair("Endpoints:end1:Url", address), - new KeyValuePair("Certificates:Default:Path", Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx")), - new KeyValuePair("Certificates:Default:Password", "testPassword"), - }).Build(); - serverOptions.Configure(config); - }) - .Configure(app => { }); - - if (useKestrelHttpsConfiguration) - { - hostBuilder.UseKestrelHttpsConfiguration(); - } + var config = new ConfigurationBuilder().AddInMemoryCollection(new[] + { + new KeyValuePair("Endpoints:end1:Url", address), + new KeyValuePair("Certificates:Default:Path", Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx")), + new KeyValuePair("Certificates:Default:Password", "testPassword"), + }).Build(); + serverOptions.Configure(config); + }) + .Configure(app => { }); + + if (useKestrelHttpsConfiguration) + { + webHostBuilder.UseKestrelHttpsConfiguration(); + } + }); var host = hostBuilder.Build(); @@ -186,18 +207,22 @@ public async Task LoadEndpointCertificate(string address, bool useKestrelHttpsCo [Fact] public async Task UseHttpsJustWorks() { - var hostBuilder = new WebHostBuilder() - .UseKestrelCore() - .ConfigureKestrel(serverOptions => + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - serverOptions.TestOverrideDefaultCertificate = new X509Certificate2(Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx"), "testPassword"); + webHostBuilder + .UseKestrelCore() + .ConfigureKestrel(serverOptions => + { + serverOptions.TestOverrideDefaultCertificate = new X509Certificate2(Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx"), "testPassword"); - serverOptions.ListenAnyIP(0, listenOptions => - { - listenOptions.UseHttps(); - }); - }) - .Configure(app => { }); + serverOptions.ListenAnyIP(0, listenOptions => + { + listenOptions.UseHttps(); + }); + }) + .Configure(app => { }); + }); var host = hostBuilder.Build(); @@ -211,19 +236,23 @@ public async Task UseHttpsJustWorks() [Fact] public async Task UseHttpsMayNotImplyUseKestrelHttpsConfiguration() { - var hostBuilder = new WebHostBuilder() - .UseKestrelCore() - .ConfigureKestrel(serverOptions => + var hostBuilder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - serverOptions.ListenAnyIP(0, listenOptions => - { - listenOptions.UseHttps(new HttpsConnectionAdapterOptions() + webHostBuilder + .UseKestrelCore() + .ConfigureKestrel(serverOptions => { - ServerCertificate = new X509Certificate2(Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx"), "testPassword"), - }); - }); - }) - .Configure(app => { }); + serverOptions.ListenAnyIP(0, listenOptions => + { + listenOptions.UseHttps(new HttpsConnectionAdapterOptions() + { + ServerCertificate = new X509Certificate2(Path.Combine("shared", "TestCertificates", "aspnetdevcert.pfx"), "testPassword"), + }); + }); + }) + .Configure(app => { }); + }); var host = hostBuilder.Build(); diff --git a/src/SignalR/clients/csharp/Client/test/UnitTests/TestServerTests.cs b/src/SignalR/clients/csharp/Client/test/UnitTests/TestServerTests.cs index 4e5580c7fbe2..d682bdc5f07f 100644 --- a/src/SignalR/clients/csharp/Client/test/UnitTests/TestServerTests.cs +++ b/src/SignalR/clients/csharp/Client/test/UnitTests/TestServerTests.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.SignalR.Tests; using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Xunit; @@ -19,20 +20,30 @@ public async Task WebSocketsWorks() { using (StartVerifiableLog()) { - var builder = new WebHostBuilder().ConfigureServices(s => - { - s.AddLogging(); - s.AddSingleton(LoggerFactory); - s.AddSignalR(); - }).Configure(app => - { - app.UseRouting(); - app.UseEndpoints(endpoints => + using var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - endpoints.MapHub("/echo"); - }); - }); - var server = new TestServer(builder); + webHostBuilder + .UseTestServer() + .ConfigureServices(s => + { + s.AddLogging(); + s.AddSingleton(LoggerFactory); + s.AddSignalR(); + }) + .Configure(app => + { + app.UseRouting(); + app.UseEndpoints(endpoints => + { + endpoints.MapHub("/echo"); + }); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); var webSocketFactoryCalled = false; var connectionBuilder = new HubConnectionBuilder() @@ -71,20 +82,30 @@ public async Task LongPollingWorks() { using (StartVerifiableLog()) { - var builder = new WebHostBuilder().ConfigureServices(s => - { - s.AddLogging(); - s.AddSingleton(LoggerFactory); - s.AddSignalR(); - }).Configure(app => - { - app.UseRouting(); - app.UseEndpoints(endpoints => + using var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - endpoints.MapHub("/echo"); - }); - }); - var server = new TestServer(builder); + webHostBuilder + .UseTestServer() + .ConfigureServices(s => + { + s.AddLogging(); + s.AddSingleton(LoggerFactory); + s.AddSignalR(); + }) + .Configure(app => + { + app.UseRouting(); + app.UseEndpoints(endpoints => + { + endpoints.MapHub("/echo"); + }); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); var connectionBuilder = new HubConnectionBuilder() .WithUrl(server.BaseAddress + "echo", options => From d028735f2a240710ccf703bb0090e4ecf6042e18 Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 17 Jul 2025 16:58:52 -0700 Subject: [PATCH 08/22] test --- .../Kestrel/Kestrel/test/HttpsConfigurationTests.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs b/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs index 8ebe671fe0f1..a360edf70f35 100644 --- a/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs +++ b/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs @@ -75,11 +75,13 @@ public void NoFallbackToHttpAddress() }); var host = hostBuilder.Build(); - await host.StartAsync(); - Assert.Equal(new[] { httpAddress, httpsAddress }, host.Services.GetRequiredService().Features.Get().Addresses); + var ex = Assert.Throws(host.Start); + Assert.Contains("Call UseKestrelHttpsConfiguration()", ex.Message); - Assert.Throws(host.Run); + var addr = Assert.Single(host.Services.GetRequiredService().Features.Get().Addresses); + // addr will contain the realized port, so we'll remove the port for comparison + Assert.Equal(httpAddress[..^2].ToString(), addr.Substring(0, addr.LastIndexOf(':'))); } [Theory] From 95e6eaabf92fa2c8a897756fa522f812b93137d5 Mon Sep 17 00:00:00 2001 From: Brennan Date: Fri, 18 Jul 2025 12:01:31 -0700 Subject: [PATCH 09/22] fix tests --- .../HostingTests.cs | 10 ++++------ .../Kestrel/test/HttpsConfigurationTests.cs | 16 +++++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs b/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs index 162af055b75d..d5b709f57231 100644 --- a/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs +++ b/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs @@ -25,18 +25,16 @@ public async Task WebhostLoadsKeyRingBeforeServerStarts() .Returns(Mock.Of()) .Callback(() => tcs.TrySetResult()); - var builder = new HostBuilder() - .ConfigureWebHost(webHostBuilder => - { - webHostBuilder - .UseStartup(); - }) +#pragma warning disable CS0618 // Type or member is obsolete + var builder = new WebHostBuilder() + .UseStartup() .ConfigureServices(s => s.AddDataProtection() .Services .Replace(ServiceDescriptor.Singleton(mockKeyRing.Object)) .AddSingleton( new FakeServer(onStart: () => tcs.TrySetException(new InvalidOperationException("Server was started before key ring was initialized"))))); +#pragma warning restore CS0618 // Type or member is obsolete using (var host = builder.Build()) { diff --git a/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs b/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs index a360edf70f35..55192565051e 100644 --- a/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs +++ b/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs @@ -42,19 +42,21 @@ public async Task BindAddressFromSetting(string address, bool useKestrelHttpsCon } }); - var host = hostBuilder.Build(); - await host.StartAsync(); - - Assert.Single(host.Services.GetRequiredService().Features.Get().Addresses, address); + using var host = hostBuilder.Build(); if (address.StartsWith("https", StringComparison.OrdinalIgnoreCase) && !useKestrelHttpsConfiguration) { - Assert.Throws(host.Run); + Assert.Throws(host.Start); + Assert.Empty(host.Services.GetRequiredService().Features.Get().Addresses); } else { - // Binding succeeds - server is already started, so we just stop it - await host.StopAsync(); + //// Binding succeeds - server is already started, so we just stop it + await host.StartAsync(); + + var addr = Assert.Single(host.Services.GetRequiredService().Features.Get().Addresses); + // addr will contain the realized port, so we'll remove the port for comparison + Assert.Equal(address[..^2].ToString(), addr.Substring(0, addr.LastIndexOf(':'))); } } From 194d3666a79be062a78f9e9ab7313458dcec4b95 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:59:34 +0000 Subject: [PATCH 10/22] Remove nowarn settings and start converting TestHost tests to HostBuilder pattern Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- ...Microsoft.AspNetCore.TestHost.Tests.csproj | 2 - .../TestHost/test/WebSocketClientTests.cs | 155 ++++++++++-------- ...tCore.Hosting.WindowsServices.Tests.csproj | 2 - .../test/WebHostServiceTests.cs | 4 + .../IStartupInjectionAssemblyName.csproj | 2 - .../IStartupInjectionAssemblyName/Program.cs | 2 + ...rosoft.AspNetCore.Hosting.TestSites.csproj | 2 - .../Program.cs | 2 + 8 files changed, 95 insertions(+), 76 deletions(-) diff --git a/src/Hosting/TestHost/test/Microsoft.AspNetCore.TestHost.Tests.csproj b/src/Hosting/TestHost/test/Microsoft.AspNetCore.TestHost.Tests.csproj index cf06dfd99f93..820cf3800f65 100644 --- a/src/Hosting/TestHost/test/Microsoft.AspNetCore.TestHost.Tests.csproj +++ b/src/Hosting/TestHost/test/Microsoft.AspNetCore.TestHost.Tests.csproj @@ -2,8 +2,6 @@ $(DefaultNetCoreTargetFramework) - - $(NoWarn);CS0618 diff --git a/src/Hosting/TestHost/test/WebSocketClientTests.cs b/src/Hosting/TestHost/test/WebSocketClientTests.cs index d17f6a43963b..fbb36956ac8c 100644 --- a/src/Hosting/TestHost/test/WebSocketClientTests.cs +++ b/src/Hosting/TestHost/test/WebSocketClientTests.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http.Features; +using Microsoft.Extensions.Hosting; namespace Microsoft.AspNetCore.TestHost.Tests; @@ -19,22 +20,29 @@ public async Task ConnectAsync_ShouldSetRequestProperties(string requestUri, str string capturedHost = null; string capturedPath = null; - using (var testServer = new TestServer(new WebHostBuilder() - .Configure(app => + using var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - app.Run(ctx => - { - if (ctx.Request.Path.StartsWithSegments("/connect")) + webHostBuilder + .UseTestServer() + .Configure(app => { - capturedScheme = ctx.Request.Scheme; - capturedHost = ctx.Request.Host.Value; - capturedPath = ctx.Request.Path; - } - return Task.FromResult(0); - }); - }))) - { - var client = testServer.CreateWebSocketClient(); + app.Run(ctx => + { + if (ctx.Request.Path.StartsWithSegments("/connect")) + { + capturedScheme = ctx.Request.Scheme; + capturedHost = ctx.Request.Host.Value; + capturedPath = ctx.Request.Path; + } + return Task.FromResult(0); + }); + }); + }) + .Build(); + + var testServer = host.GetTestServer(); + var client = testServer.CreateWebSocketClient(); try { @@ -46,7 +54,6 @@ await client.ConnectAsync( { // An exception will be thrown because our dummy endpoint does not implement a full Web socket server } - } Assert.Equal("http", capturedScheme); Assert.Equal(expectedHost, capturedHost); @@ -56,72 +63,84 @@ await client.ConnectAsync( [Fact] public async Task CanAcceptWebSocket() { - using (var testServer = new TestServer(new WebHostBuilder() - .Configure(app => + using var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - app.UseWebSockets(); - app.Run(async ctx => - { - if (ctx.Request.Path.StartsWithSegments("/connect")) + webHostBuilder + .UseTestServer() + .Configure(app => { - if (ctx.WebSockets.IsWebSocketRequest) + app.UseWebSockets(); + app.Run(async ctx => { - using var websocket = await ctx.WebSockets.AcceptWebSocketAsync(); - var buffer = new byte[1000]; - var res = await websocket.ReceiveAsync(buffer, default); - await websocket.SendAsync(buffer.AsMemory(0, res.Count), System.Net.WebSockets.WebSocketMessageType.Binary, true, default); - await websocket.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.NormalClosure, null, default); - } - } - }); - }))) - { - var client = testServer.CreateWebSocketClient(); + if (ctx.Request.Path.StartsWithSegments("/connect")) + { + if (ctx.WebSockets.IsWebSocketRequest) + { + using var websocket = await ctx.WebSockets.AcceptWebSocketAsync(); + var buffer = new byte[1000]; + var res = await websocket.ReceiveAsync(buffer, default); + await websocket.SendAsync(buffer.AsMemory(0, res.Count), System.Net.WebSockets.WebSocketMessageType.Binary, true, default); + await websocket.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.NormalClosure, null, default); + } + } + }); + }); + }) + .Build(); - using var socket = await client.ConnectAsync( - uri: new Uri("http://localhost/connect"), - cancellationToken: default); + var testServer = host.GetTestServer(); + var client = testServer.CreateWebSocketClient(); - await socket.SendAsync(new byte[10], System.Net.WebSockets.WebSocketMessageType.Binary, true, default); - var res = await socket.ReceiveAsync(new byte[100], default); - Assert.Equal(10, res.Count); - Assert.True(res.EndOfMessage); + using var socket = await client.ConnectAsync( + uri: new Uri("http://localhost/connect"), + cancellationToken: default); - await socket.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.NormalClosure, null, default); - } + await socket.SendAsync(new byte[10], System.Net.WebSockets.WebSocketMessageType.Binary, true, default); + var res = await socket.ReceiveAsync(new byte[100], default); + Assert.Equal(10, res.Count); + Assert.True(res.EndOfMessage); + + await socket.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.NormalClosure, null, default); } [Fact] public async Task VerifyWebSocketAndUpgradeFeatures() { - using (var testServer = new TestServer(new WebHostBuilder() - .Configure(app => + using var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - app.Run(async c => - { - var upgradeFeature = c.Features.Get(); - Assert.NotNull(upgradeFeature); - Assert.False(upgradeFeature.IsUpgradableRequest); - await Assert.ThrowsAsync(() => upgradeFeature.UpgradeAsync()); - - var webSocketFeature = c.Features.Get(); - Assert.NotNull(webSocketFeature); - Assert.True(webSocketFeature.IsWebSocketRequest); - }); - }))) - { - var client = testServer.CreateWebSocketClient(); + webHostBuilder + .UseTestServer() + .Configure(app => + { + app.Run(async c => + { + var upgradeFeature = c.Features.Get(); + Assert.NotNull(upgradeFeature); + Assert.False(upgradeFeature.IsUpgradableRequest); + await Assert.ThrowsAsync(() => upgradeFeature.UpgradeAsync()); - try - { - using var socket = await client.ConnectAsync( - uri: new Uri("http://localhost/connect"), - cancellationToken: default); - } - catch - { - // An exception will be thrown because our endpoint does not accept the websocket - } + var webSocketFeature = c.Features.Get(); + Assert.NotNull(webSocketFeature); + Assert.True(webSocketFeature.IsWebSocketRequest); + }); + }); + }) + .Build(); + + var testServer = host.GetTestServer(); + var client = testServer.CreateWebSocketClient(); + + try + { + using var socket = await client.ConnectAsync( + uri: new Uri("http://localhost/connect"), + cancellationToken: default); + } + catch + { + // An exception will be thrown because our endpoint does not accept the websocket } } } diff --git a/src/Hosting/WindowsServices/test/Microsoft.AspNetCore.Hosting.WindowsServices.Tests.csproj b/src/Hosting/WindowsServices/test/Microsoft.AspNetCore.Hosting.WindowsServices.Tests.csproj index c61d39779f09..431869c11222 100644 --- a/src/Hosting/WindowsServices/test/Microsoft.AspNetCore.Hosting.WindowsServices.Tests.csproj +++ b/src/Hosting/WindowsServices/test/Microsoft.AspNetCore.Hosting.WindowsServices.Tests.csproj @@ -2,8 +2,6 @@ $(DefaultNetCoreTargetFramework) - - $(NoWarn);CS0618 diff --git a/src/Hosting/WindowsServices/test/WebHostServiceTests.cs b/src/Hosting/WindowsServices/test/WebHostServiceTests.cs index 16a4bcac02c2..9d64fd3095c2 100644 --- a/src/Hosting/WindowsServices/test/WebHostServiceTests.cs +++ b/src/Hosting/WindowsServices/test/WebHostServiceTests.cs @@ -19,7 +19,9 @@ public class WebHostServiceTests [ConditionalFact] public async Task StopBeforeServiceStarted() { +#pragma warning disable CS0618 // Type or member is obsolete var host = new WebHostBuilder().UseServer(new FakeServer()).Configure(x => { }).Build(); +#pragma warning restore CS0618 // Type or member is obsolete var webHostService = new WebHostService(host); var applicationLifetime = host.Services.GetRequiredService(); @@ -33,7 +35,9 @@ await Assert.ThrowsAsync( [ConditionalFact] public async Task StopAfterServiceStarted() { +#pragma warning disable CS0618 // Type or member is obsolete var host = new WebHostBuilder().UseServer(new FakeServer()).Configure(x => { }).Build(); +#pragma warning restore CS0618 // Type or member is obsolete var webHostService = new WebHostService(host); var applicationLifetime = host.Services.GetRequiredService(); diff --git a/src/Hosting/test/testassets/IStartupInjectionAssemblyName/IStartupInjectionAssemblyName.csproj b/src/Hosting/test/testassets/IStartupInjectionAssemblyName/IStartupInjectionAssemblyName.csproj index 9fded2eebdc3..71d8a7873ca5 100644 --- a/src/Hosting/test/testassets/IStartupInjectionAssemblyName/IStartupInjectionAssemblyName.csproj +++ b/src/Hosting/test/testassets/IStartupInjectionAssemblyName/IStartupInjectionAssemblyName.csproj @@ -3,8 +3,6 @@ $(DefaultNetCoreTargetFramework) Exe - - $(NoWarn);CS0618 diff --git a/src/Hosting/test/testassets/IStartupInjectionAssemblyName/Program.cs b/src/Hosting/test/testassets/IStartupInjectionAssemblyName/Program.cs index 99f3ded974a5..7722483489cf 100644 --- a/src/Hosting/test/testassets/IStartupInjectionAssemblyName/Program.cs +++ b/src/Hosting/test/testassets/IStartupInjectionAssemblyName/Program.cs @@ -18,7 +18,9 @@ public static void Main(string[] args) // Do not change the signature of this method. It's used for tests. private static IWebHostBuilder CreateWebHostBuilder(string[] args) => +#pragma warning disable CS0618 // Type or member is obsolete new WebHostBuilder() .SuppressStatusMessages(true) .ConfigureServices(services => services.AddSingleton()); +#pragma warning restore CS0618 // Type or member is obsolete } diff --git a/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Microsoft.AspNetCore.Hosting.TestSites.csproj b/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Microsoft.AspNetCore.Hosting.TestSites.csproj index 56885418116e..64124387250e 100644 --- a/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Microsoft.AspNetCore.Hosting.TestSites.csproj +++ b/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Microsoft.AspNetCore.Hosting.TestSites.csproj @@ -3,8 +3,6 @@ $(DefaultNetCoreTargetFramework) Exe - - $(NoWarn);CS0618 diff --git a/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs b/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs index e211da9e1405..4d4d6a1a95c6 100644 --- a/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs +++ b/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs @@ -22,6 +22,7 @@ public static void Main(string[] args) .AddEnvironmentVariables(prefix: "ASPNETCORE_") .Build(); +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .UseServer(new NoopServer()) .UseConfiguration(config) @@ -32,6 +33,7 @@ public static void Main(string[] args) factory.AddFilter(level => level >= LogLevel.Warning); }) .UseStartup("Microsoft.AspNetCore.Hosting.TestSites"); +#pragma warning restore CS0618 // Type or member is obsolete if (config["STARTMECHANIC"] == "Run") { From e87e3832d2b86aa151cdcf6b169ad56b6e5e5da9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 18 Jul 2025 22:05:38 +0000 Subject: [PATCH 11/22] Complete conversion of RequestBuilderTests, ClientHandlerTests, and WebSocketClientTests to HostBuilder Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- .../TestHost/test/ClientHandlerTests.cs | 29 ++++++++++------ .../TestHost/test/RequestBuilderTests.cs | 34 +++++++++++++++---- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/Hosting/TestHost/test/ClientHandlerTests.cs b/src/Hosting/TestHost/test/ClientHandlerTests.cs index 503408f0df05..698172bfbcc3 100644 --- a/src/Hosting/TestHost/test/ClientHandlerTests.cs +++ b/src/Hosting/TestHost/test/ClientHandlerTests.cs @@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.InternalTesting; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Net.Http.Headers; @@ -691,19 +692,25 @@ public async Task ClientHandlerCreateContextWithDefaultRequestParameters() { // This logger will attempt to access information from HttpRequest once the HttpContext is created var logger = new VerifierLogger(); - var builder = new WebHostBuilder() - .ConfigureServices(services => + using var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - services.AddSingleton>(logger); + webHostBuilder + .UseTestServer() + .ConfigureServices(services => + { + services.AddSingleton>(logger); + }) + .Configure(app => + { + app.Run(context => + { + return Task.FromResult(0); + }); + }); }) - .Configure(app => - { - app.Run(context => - { - return Task.FromResult(0); - }); - }); - var server = new TestServer(builder); + .Build(); + var server = host.GetTestServer(); // The HttpContext will be created and the logger will make sure that the HttpRequest exists and contains reasonable values var result = await server.CreateClient().GetStringAsync("/"); diff --git a/src/Hosting/TestHost/test/RequestBuilderTests.cs b/src/Hosting/TestHost/test/RequestBuilderTests.cs index 5b6703e5ac90..f3ac06797787 100644 --- a/src/Hosting/TestHost/test/RequestBuilderTests.cs +++ b/src/Hosting/TestHost/test/RequestBuilderTests.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; namespace Microsoft.AspNetCore.TestHost; @@ -10,8 +11,15 @@ public class RequestBuilderTests [Fact] public void AddRequestHeader() { - var builder = new WebHostBuilder().Configure(app => { }); - var server = new TestServer(builder); + using var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseTestServer() + .Configure(app => { }); + }) + .Build(); + var server = host.GetTestServer(); server.CreateRequest("/") .AddHeader("Host", "MyHost:90") .And(request => @@ -23,8 +31,15 @@ public void AddRequestHeader() [Fact] public void AddContentHeaders() { - var builder = new WebHostBuilder().Configure(app => { }); - var server = new TestServer(builder); + using var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseTestServer() + .Configure(app => { }); + }) + .Build(); + var server = host.GetTestServer(); server.CreateRequest("/") .AddHeader("Content-Type", "Test/Value") .And(request => @@ -38,8 +53,15 @@ public void AddContentHeaders() public void TestServer_PropertyShouldHoldTestServerInstance() { // Arrange - var builder = new WebHostBuilder().Configure(app => { }); - var server = new TestServer(builder); + using var host = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseTestServer() + .Configure(app => { }); + }) + .Build(); + var server = host.GetTestServer(); // Act var requestBuilder = server.CreateRequest("/"); From bd4d52fb5f7fc6e050b9c142191f9452dd655106 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 19 Jul 2025 00:24:59 +0000 Subject: [PATCH 12/22] Start converting TestHost test files to HostBuilder pattern Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- .../TestHost/test/HttpContextBuilderTests.cs | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs index 30ebbf3f18f3..96d0da259706 100644 --- a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs +++ b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.InternalTesting; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace Microsoft.AspNetCore.TestHost; @@ -17,8 +18,15 @@ public class HttpContextBuilderTests [Fact] public async Task ExpectedValuesAreAvailable() { - var builder = new WebHostBuilder().Configure(app => { }); - var server = new TestServer(builder); + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => + { + webBuilder + .UseTestServer() + .Configure(app => { }); + }) + .Build(); + var server = host.GetTestServer(); server.BaseAddress = new Uri("https://example.com/A/Path/"); var context = await server.SendAsync(c => { @@ -48,8 +56,15 @@ public async Task ExpectedValuesAreAvailable() public async Task UserAgentHeaderWorks() { var userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"; - var builder = new WebHostBuilder().Configure(app => { }); - var server = new TestServer(builder); + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => + { + webBuilder + .UseTestServer() + .Configure(app => { }); + }) + .Build(); + var server = host.GetTestServer(); server.BaseAddress = new Uri("https://example.com/"); var context = await server.SendAsync(c => { @@ -63,8 +78,23 @@ public async Task UserAgentHeaderWorks() [Fact] public async Task SingleSlashNotMovedToPathBase() { - var builder = new WebHostBuilder().Configure(app => { }); - var server = new TestServer(builder); + using var host = new HostBuilder() + + .ConfigureWebHost(webBuilder => + + { + + webBuilder + + .UseTestServer() + + .Configure(app => { }); + + }) + + .Build(); + + var server = host.GetTestServer(); var context = await server.SendAsync(c => { c.Request.Path = "/"; From b146f4db74025b552ec89b20a960a4dd441476ef Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 19 Jul 2025 00:28:06 +0000 Subject: [PATCH 13/22] Complete conversion of HttpContextBuilderTests.cs to HostBuilder pattern Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- .../TestHost/test/HttpContextBuilderTests.cs | 59 ++++++++++--------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs index 96d0da259706..fd4df8515b36 100644 --- a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs +++ b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs @@ -79,21 +79,13 @@ public async Task UserAgentHeaderWorks() public async Task SingleSlashNotMovedToPathBase() { using var host = new HostBuilder() - .ConfigureWebHost(webBuilder => - { - webBuilder - .UseTestServer() - .Configure(app => { }); - }) - .Build(); - var server = host.GetTestServer(); var context = await server.SendAsync(c => { @@ -107,15 +99,22 @@ public async Task SingleSlashNotMovedToPathBase() [Fact] public async Task MiddlewareOnlySetsHeaders() { - var builder = new WebHostBuilder().Configure(app => - { - app.Run(c => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - c.Response.Headers["TestHeader"] = "TestValue"; - return Task.FromResult(0); - }); - }); - var server = new TestServer(builder); + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(c => + { + c.Response.Headers["TestHeader"] = "TestValue"; + return Task.FromResult(0); + }); + }); + }) + .Build(); + var server = host.GetTestServer(); var context = await server.SendAsync(c => { }); Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); @@ -336,19 +335,25 @@ public async Task ClientHandlerCreateContextWithDefaultRequestParameters() { // This logger will attempt to access information from HttpRequest once the HttpContext is created var logger = new VerifierLogger(); - var builder = new WebHostBuilder() - .ConfigureServices(services => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - services.AddSingleton>(logger); + webBuilder + .UseTestServer() + .ConfigureServices(services => + { + services.AddSingleton>(logger); + }) + .Configure(app => + { + app.Run(context => + { + return Task.FromResult(0); + }); + }); }) - .Configure(app => - { - app.Run(context => - { - return Task.FromResult(0); - }); - }); - var server = new TestServer(builder); + .Build(); + var server = host.GetTestServer(); // The HttpContext will be created and the logger will make sure that the HttpRequest exists and contains reasonable values var ctx = await server.SendAsync(c => { }); From 2f609b981742c51c34e343d70f295a6698dabb93 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 19 Jul 2025 00:30:08 +0000 Subject: [PATCH 14/22] Partial conversion of TestClientTests.cs and TestServerTests.cs to HostBuilder Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- src/Hosting/TestHost/test/TestClientTests.cs | 361 +++++++++++++++++-- src/Hosting/TestHost/test/TestServerTests.cs | 27 +- 2 files changed, 354 insertions(+), 34 deletions(-) diff --git a/src/Hosting/TestHost/test/TestClientTests.cs b/src/Hosting/TestHost/test/TestClientTests.cs index ce9c3a76c892..cd5d3758e0db 100644 --- a/src/Hosting/TestHost/test/TestClientTests.cs +++ b/src/Hosting/TestHost/test/TestClientTests.cs @@ -12,6 +12,7 @@ using Microsoft.AspNetCore.Internal; using Microsoft.AspNetCore.InternalTesting; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Net.Http.Headers; @@ -26,8 +27,23 @@ public async Task GetAsyncWorks() var expected = "GET Response"; RequestDelegate appDelegate = ctx => ctx.Response.WriteAsync(expected); - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + .ConfigureWebHost(webBuilder => + + { + + webBuilder + + .UseTestServer() + + .Configure(app => app.Run(appDelegate)); + + }) + + .Build(); + + var server = host.GetTestServer(); var client = server.CreateClient(); // Act @@ -48,8 +64,23 @@ public async Task NoTrailingSlash_NoPathBase() Assert.Equal("/", ctx.Request.Path.Value); return ctx.Response.WriteAsync(expected); }; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + .ConfigureWebHost(webBuilder => + + { + + webBuilder + + .UseTestServer() + + .Configure(app => app.Run(appDelegate)); + + }) + + .Build(); + + var server = host.GetTestServer(); var client = server.CreateClient(); // Act @@ -70,8 +101,23 @@ public async Task SingleTrailingSlash_NoPathBase() Assert.Equal("/", ctx.Request.Path.Value); return ctx.Response.WriteAsync(expected); }; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + .ConfigureWebHost(webBuilder => + + { + + webBuilder + + .UseTestServer() + + .Configure(app => app.Run(appDelegate)); + + }) + + .Build(); + + var server = host.GetTestServer(); var client = server.CreateClient(); // Act @@ -90,8 +136,23 @@ public async Task PutAsyncWorks() var content = await new StreamReader(ctx.Request.Body).ReadToEndAsync(); await ctx.Response.WriteAsync(content + " PUT Response"); }; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + .ConfigureWebHost(webBuilder => + + { + + webBuilder + + .UseTestServer() + + .Configure(app => app.Run(appDelegate)); + + }) + + .Build(); + + var server = host.GetTestServer(); var client = server.CreateClient(); // Act @@ -108,8 +169,23 @@ public async Task PostAsyncWorks() // Arrange RequestDelegate appDelegate = async ctx => await ctx.Response.WriteAsync(await new StreamReader(ctx.Request.Body).ReadToEndAsync() + " POST Response"); - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + .ConfigureWebHost(webBuilder => + + { + + webBuilder + + .UseTestServer() + + .Configure(app => app.Run(appDelegate)); + + }) + + .Build(); + + var server = host.GetTestServer(); var client = server.CreateClient(); // Act @@ -189,8 +265,31 @@ public async Task ClientStreamingWorks() Stream requestStream = null; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + + .ConfigureWebHost(webBuilder => + + + { + + + webBuilder + + + .UseTestServer() + + + .Configure(app => app.Run(appDelegate)); + + + }) + + + .Build(); + + + var server = host.GetTestServer(); var client = server.CreateClient(); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:12345"); @@ -246,8 +345,31 @@ public async Task ClientStreaming_HttpContentException() return Task.CompletedTask; }; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + + .ConfigureWebHost(webBuilder => + + + { + + + webBuilder + + + .UseTestServer() + + + .Configure(app => app.Run(appDelegate)); + + + }) + + + .Build(); + + + var server = host.GetTestServer(); var client = server.CreateClient(); var message = new HttpRequestMessage(HttpMethod.Post, "https://example.com/"); @@ -297,8 +419,31 @@ public async Task ClientStreaming_Cancellation() Stream requestStream = null; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + + .ConfigureWebHost(webBuilder => + + + { + + + webBuilder + + + .UseTestServer() + + + .Configure(app => app.Run(appDelegate)); + + + }) + + + .Build(); + + + var server = host.GetTestServer(); var client = server.CreateClient(); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:12345"); @@ -354,8 +499,31 @@ public async Task ClientStreaming_ResponseCompletesWithoutReadingRequest() Stream requestStream = null; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + + .ConfigureWebHost(webBuilder => + + + { + + + webBuilder + + + .UseTestServer() + + + .Configure(app => app.Run(appDelegate)); + + + }) + + + .Build(); + + + var server = host.GetTestServer(); var client = server.CreateClient(); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:12345"); @@ -416,8 +584,31 @@ public async Task ClientStreaming_ResponseCompletesWithPendingRead_ThrowError() Stream requestStream = null; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + + .ConfigureWebHost(webBuilder => + + + { + + + webBuilder + + + .UseTestServer() + + + .Configure(app => app.Run(appDelegate)); + + + }) + + + .Build(); + + + var server = host.GetTestServer(); var client = server.CreateClient(); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:12345"); @@ -463,8 +654,31 @@ public async Task ClientStreaming_ResponseCompletesWithoutResponseBodyWrite() Stream requestStream = null; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + + .ConfigureWebHost(webBuilder => + + + { + + + webBuilder + + + .UseTestServer() + + + .Configure(app => app.Run(appDelegate)); + + + }) + + + .Build(); + + + var server = host.GetTestServer(); var client = server.CreateClient(); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:12345"); @@ -514,8 +728,31 @@ public async Task ClientStreaming_ServerAbort() Stream requestStream = null; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + + .ConfigureWebHost(webBuilder => + + + { + + + webBuilder + + + .UseTestServer() + + + .Configure(app => app.Run(appDelegate)); + + + }) + + + .Build(); + + + var server = host.GetTestServer(); var client = server.CreateClient(); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:12345"); @@ -844,8 +1081,23 @@ public async Task ClientDisposalAbortsRequest() }; // Act - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + .ConfigureWebHost(webBuilder => + + { + + webBuilder + + .UseTestServer() + + .Configure(app => app.Run(appDelegate)); + + }) + + .Build(); + + var server = host.GetTestServer(); var client = server.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:12345"); var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); @@ -946,8 +1198,23 @@ public async Task SendAsync_Default_Protocol11() protocol = ctx.Request.Protocol; await ctx.Response.WriteAsync(expected); }; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + .ConfigureWebHost(webBuilder => + + { + + webBuilder + + .UseTestServer() + + .Configure(app => app.Run(appDelegate)); + + }) + + .Build(); + + var server = host.GetTestServer(); var client = server.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:12345"); @@ -972,8 +1239,23 @@ public async Task SendAsync_ExplicitlySet_Protocol20() protocol = ctx.Request.Protocol; await ctx.Response.WriteAsync(expected); }; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + .ConfigureWebHost(webBuilder => + + { + + webBuilder + + .UseTestServer() + + .Configure(app => app.Run(appDelegate)); + + }) + + .Build(); + + var server = host.GetTestServer(); var client = server.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:12345"); request.Version = new Version(2, 0); @@ -999,8 +1281,23 @@ public async Task SendAsync_ExplicitlySet_Protocol30() protocol = ctx.Request.Protocol; await ctx.Response.WriteAsync(expected); }; - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + .ConfigureWebHost(webBuilder => + + { + + webBuilder + + .UseTestServer() + + .Configure(app => app.Run(appDelegate)); + + }) + + .Build(); + + var server = host.GetTestServer(); var client = server.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:12345"); request.Version = new Version(3, 0); diff --git a/src/Hosting/TestHost/test/TestServerTests.cs b/src/Hosting/TestHost/test/TestServerTests.cs index 8437d11065cc..8836217affb0 100644 --- a/src/Hosting/TestHost/test/TestServerTests.cs +++ b/src/Hosting/TestHost/test/TestServerTests.cs @@ -783,8 +783,31 @@ public async Task ManuallySetHostWinsOverInferredHostFromRequestUri(string uri) RequestDelegate appDelegate = ctx => ctx.Response.WriteAsync(ctx.Request.Headers.Host); - var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); + using var host = new HostBuilder() + + + .ConfigureWebHost(webBuilder => + + + { + + + webBuilder + + + .UseTestServer() + + + .Configure(app => app.Run(appDelegate)); + + + }) + + + .Build(); + + + var server = host.GetTestServer(); var client = server.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Get, uri); From dfcad5277f266d80d8d216b16b20e0585c94dec5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 20 Jul 2025 23:18:58 +0000 Subject: [PATCH 15/22] Complete TestHost test file WebHostBuilder conversion - added pragma disable warnings for all remaining WebHostBuilder usages in TestServerTests.cs, TestClientTests.cs, and HttpContextBuilderTests.cs Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- .../TestHost/test/HttpContextBuilderTests.cs | 2 + src/Hosting/TestHost/test/TestClientTests.cs | 125 +++--------------- src/Hosting/TestHost/test/TestServerTests.cs | 71 +++++++--- 3 files changed, 78 insertions(+), 120 deletions(-) diff --git a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs index fd4df8515b36..18218c8a35a7 100644 --- a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs +++ b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +#pragma warning disable CS0618 // Type or member is obsolete + using System.Text; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; diff --git a/src/Hosting/TestHost/test/TestClientTests.cs b/src/Hosting/TestHost/test/TestClientTests.cs index cd5d3758e0db..b21250de0698 100644 --- a/src/Hosting/TestHost/test/TestClientTests.cs +++ b/src/Hosting/TestHost/test/TestClientTests.cs @@ -208,6 +208,7 @@ public async Task LargePayload_DisposesRequest_AfterResponseIsCompleted() data[i] = character[0]; } +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder(); RequestDelegate app = async ctx => { @@ -222,6 +223,7 @@ public async Task LargePayload_DisposesRequest_AfterResponseIsCompleted() builder.Configure(appBuilder => appBuilder.Run(app)); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete var client = server.CreateClient(); // Act & Assert @@ -266,29 +268,14 @@ public async Task ClientStreamingWorks() Stream requestStream = null; using var host = new HostBuilder() - - .ConfigureWebHost(webBuilder => - - { - - webBuilder - - .UseTestServer() - - .Configure(app => app.Run(appDelegate)); - - }) - - .Build(); - var server = host.GetTestServer(); var client = server.CreateClient(); @@ -346,29 +333,14 @@ public async Task ClientStreaming_HttpContentException() }; using var host = new HostBuilder() - - .ConfigureWebHost(webBuilder => - - { - - webBuilder - - .UseTestServer() - - .Configure(app => app.Run(appDelegate)); - - }) - - .Build(); - var server = host.GetTestServer(); var client = server.CreateClient(); @@ -420,29 +392,14 @@ public async Task ClientStreaming_Cancellation() Stream requestStream = null; using var host = new HostBuilder() - - .ConfigureWebHost(webBuilder => - - { - - webBuilder - - .UseTestServer() - - .Configure(app => app.Run(appDelegate)); - - }) - - .Build(); - var server = host.GetTestServer(); var client = server.CreateClient(); @@ -500,29 +457,14 @@ public async Task ClientStreaming_ResponseCompletesWithoutReadingRequest() Stream requestStream = null; using var host = new HostBuilder() - - .ConfigureWebHost(webBuilder => - - { - - webBuilder - - .UseTestServer() - - .Configure(app => app.Run(appDelegate)); - - }) - - .Build(); - var server = host.GetTestServer(); var client = server.CreateClient(); @@ -585,29 +527,14 @@ public async Task ClientStreaming_ResponseCompletesWithPendingRead_ThrowError() Stream requestStream = null; using var host = new HostBuilder() - - .ConfigureWebHost(webBuilder => - - { - - webBuilder - - .UseTestServer() - - .Configure(app => app.Run(appDelegate)); - - }) - - .Build(); - var server = host.GetTestServer(); var client = server.CreateClient(); @@ -655,29 +582,14 @@ public async Task ClientStreaming_ResponseCompletesWithoutResponseBodyWrite() Stream requestStream = null; using var host = new HostBuilder() - - .ConfigureWebHost(webBuilder => - - { - - webBuilder - - .UseTestServer() - - .Configure(app => app.Run(appDelegate)); - - }) - - .Build(); - var server = host.GetTestServer(); var client = server.CreateClient(); @@ -729,29 +641,14 @@ public async Task ClientStreaming_ServerAbort() Stream requestStream = null; using var host = new HostBuilder() - - .ConfigureWebHost(webBuilder => - - { - - webBuilder - - .UseTestServer() - - .Configure(app => app.Run(appDelegate)); - - }) - - .Build(); - var server = host.GetTestServer(); var client = server.CreateClient(); @@ -835,6 +732,7 @@ public async Task WebSocketWorks() } } }; +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .ConfigureServices(services => { @@ -845,6 +743,7 @@ public async Task WebSocketWorks() app.Run(appDelegate); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete // Act var client = server.CreateWebSocketClient(); @@ -905,12 +804,14 @@ public async Task WebSocketSubProtocolsWorks() } } }; +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(app => { app.Run(appDelegate); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete // Act var client = server.CreateWebSocketClient(); @@ -957,10 +858,12 @@ public async Task WebSocketAcceptThrowsWhenCancelled() } } }; +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .ConfigureServices(services => services.AddSingleton>(logger)) .Configure(app => app.Run(appDelegate)); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete // Act var client = server.CreateWebSocketClient(); @@ -1000,11 +903,13 @@ public async Task WebSocketDisposalThrowsOnPeer() websocket.Dispose(); } }; +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(appDelegate); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete // Act var client = server.CreateWebSocketClient(); @@ -1033,11 +938,13 @@ public async Task WebSocketTinyReceiveGeneratesEndOfMessage() } } }; +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(appDelegate); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete // Act var client = server.CreateWebSocketClient(); @@ -1112,6 +1019,7 @@ public async Task ClientDisposalAbortsRequest() public async Task ClientCancellationAbortsRequest() { var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => app.Run(async ctx => { try @@ -1127,6 +1035,7 @@ public async Task ClientCancellationAbortsRequest() throw new InvalidOperationException("The request was not aborted"); })); using var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete using var client = server.CreateClient(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1)); var response = await Assert.ThrowsAnyAsync(() => client.GetAsync("http://localhost:12345", cts.Token)); @@ -1142,6 +1051,7 @@ public async Task AsyncLocalValueOnClientIsNotPreserved() asyncLocal.Value = value; object capturedValue = null; +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(app => { @@ -1152,6 +1062,7 @@ public async Task AsyncLocalValueOnClientIsNotPreserved() }); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete var client = server.CreateClient(); var resp = await client.GetAsync("/"); @@ -1167,6 +1078,7 @@ public async Task AsyncLocalValueOnClientIsPreservedIfPreserveExecutionContextIs asyncLocal.Value = value; object capturedValue = null; +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(app => { @@ -1180,6 +1092,7 @@ public async Task AsyncLocalValueOnClientIsPreservedIfPreserveExecutionContextIs { PreserveExecutionContext = true }; +#pragma warning restore CS0618 // Type or member is obsolete var client = server.CreateClient(); var resp = await client.GetAsync("/"); @@ -1315,6 +1228,7 @@ public async Task SendAsync_ExplicitlySet_Protocol30() [Fact] public async Task VerifyWebSocketAndUpgradeFeaturesForNonWebSocket() { +#pragma warning disable CS0618 // Type or member is obsolete using (var testServer = new TestServer(new WebHostBuilder() .Configure(app => { @@ -1334,6 +1248,7 @@ public async Task VerifyWebSocketAndUpgradeFeaturesForNonWebSocket() await c.Response.WriteAsync("test"); }); }))) +#pragma warning restore CS0618 // Type or member is obsolete { var client = testServer.CreateClient(); diff --git a/src/Hosting/TestHost/test/TestServerTests.cs b/src/Hosting/TestHost/test/TestServerTests.cs index 8836217affb0..7f8f23a92618 100644 --- a/src/Hosting/TestHost/test/TestServerTests.cs +++ b/src/Hosting/TestHost/test/TestServerTests.cs @@ -92,23 +92,28 @@ public void CreateWithDelegate() { // Arrange // Act & Assert (Does not throw) +#pragma warning disable CS0618 // Type or member is obsolete new TestServer(new WebHostBuilder().Configure(app => { })); +#pragma warning restore CS0618 // Type or member is obsolete } [Fact] public void CreateWithDelegate_DI() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(app => { }) .UseTestServer(); using var host = builder.Build(); +#pragma warning restore CS0618 // Type or member is obsolete host.Start(); } [Fact] public void DoesNotCaptureStartupErrorsByDefault() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(app => { @@ -116,11 +121,13 @@ public void DoesNotCaptureStartupErrorsByDefault() }); Assert.Throws(() => new TestServer(builder)); +#pragma warning restore CS0618 // Type or member is obsolete } [Fact] public async Task ServicesCanBeOverridenForTestingAsync() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .ConfigureServices(s => s.AddSingleton, ThirdPartyContainerServiceProviderFactory>()) .UseStartup() @@ -128,6 +135,7 @@ public async Task ServicesCanBeOverridenForTestingAsync() .ConfigureTestContainer(container => container.Services.AddSingleton(new TestService { Message = "OverridesConfigureContainer" })); var host = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete var response = await host.CreateClient().GetStringAsync("/"); @@ -162,6 +170,7 @@ public class ThirdPartyContainerServiceProviderFactory : IServiceProviderFactory [Fact] public void CaptureStartupErrorsSettingPreserved() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .CaptureStartupErrors(true) .Configure(app => @@ -171,12 +180,14 @@ public void CaptureStartupErrorsSettingPreserved() // Does not throw new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete } [Fact] public void ApplicationServicesAvailableFromTestServer() { var testService = new TestService(); +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(app => { }) .ConfigureServices(services => @@ -184,6 +195,7 @@ public void ApplicationServicesAvailableFromTestServer() services.AddSingleton(testService); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete Assert.Equal(testService, server.Host.Services.GetRequiredService()); } @@ -191,6 +203,7 @@ public void ApplicationServicesAvailableFromTestServer() [Fact] public async Task RequestServicesAutoCreated() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(context => @@ -199,6 +212,7 @@ public async Task RequestServicesAutoCreated() }); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("RequestServices:True", result); @@ -207,6 +221,7 @@ public async Task RequestServicesAutoCreated() [Fact] public async Task DispoingTheRequestBodyDoesNotDisposeClientStreams() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(async context => @@ -218,6 +233,7 @@ public async Task DispoingTheRequestBodyDoesNotDisposeClientStreams() }); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete var stream = new ThrowOnDisposeStream(); stream.Write(Encoding.ASCII.GetBytes("Hello World")); @@ -250,8 +266,10 @@ public void Configure(IApplicationBuilder app) [Fact] public async Task CustomServiceProviderSetsApplicationServices() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().UseStartup(); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("ApplicationServicesEqual:True", result); } @@ -261,6 +279,7 @@ public void TestServerConstructorWithFeatureCollectionAllowsInitializingServerFe { // Arrange var url = "http://localhost:8000/appName/serviceName"; +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .UseUrls(url) .Configure(applicationBuilder => @@ -268,6 +287,7 @@ public void TestServerConstructorWithFeatureCollectionAllowsInitializingServerFe var serverAddressesFeature = applicationBuilder.ServerFeatures.Get(); Assert.Contains(serverAddressesFeature.Addresses, s => string.Equals(s, url, StringComparison.Ordinal)); }); +#pragma warning restore CS0618 // Type or member is obsolete var featureCollection = new FeatureCollection(); featureCollection.Set(new ServerAddressesFeature()); @@ -283,6 +303,7 @@ public void TestServerConstructorWithFeatureCollectionAllowsInitializingServerFe public void TestServerConstructedWithoutFeatureCollectionHasServerAddressesFeature() { // Arrange +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(applicationBuilder => { @@ -292,6 +313,7 @@ public void TestServerConstructedWithoutFeatureCollectionHasServerAddressesFeatu // Act new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete // Assert // Is inside configure callback @@ -300,10 +322,12 @@ public void TestServerConstructedWithoutFeatureCollectionHasServerAddressesFeatu [Fact] public void TestServerConstructorWithNullFeatureCollectionThrows() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(b => { }); Assert.Throws(() => new TestServer(builder, null)); +#pragma warning restore CS0618 // Type or member is obsolete } [Fact] @@ -324,12 +348,14 @@ public void TestServerConstructorShouldProvideServicesFromWebHost() { // Arrange var testService = new TestService(); +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .ConfigureServices(services => services.AddSingleton(testService)) .Configure(_ => { }); // Act var testServer = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete // Assert Assert.Equal(testService, testServer.Services.GetService()); @@ -423,6 +449,7 @@ public Action Configure(Action next) [Fact] public async Task ExistingRequestServicesWillNotBeReplaced() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(context => @@ -436,6 +463,7 @@ public async Task ExistingRequestServicesWillNotBeReplaced() services.AddTransient(); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Found:True", result); @@ -444,6 +472,7 @@ public async Task ExistingRequestServicesWillNotBeReplaced() [Fact] public async Task CanSetCustomServiceProvider() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(context => @@ -458,6 +487,7 @@ public async Task CanSetCustomServiceProvider() }); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Success", result); @@ -493,6 +523,7 @@ public Action Configure(Action next) public async Task ExistingServiceProviderFeatureWillNotBeReplaced() { var appServices = new ServiceCollection().BuildServiceProvider(); +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(context => @@ -506,6 +537,7 @@ public async Task ExistingServiceProviderFeatureWillNotBeReplaced() services.AddSingleton(new ReplaceServiceProvidersFeatureFilter(appServices, appServices)); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete var result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Success", result); @@ -534,6 +566,7 @@ public Action Configure(Action next) [Fact] public async Task WillReplaceServiceProviderFeatureWithNullRequestServices() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(context => @@ -547,6 +580,7 @@ public async Task WillReplaceServiceProviderFeatureWithNullRequestServices() services.AddTransient(); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete var result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Success", result); @@ -555,6 +589,7 @@ public async Task WillReplaceServiceProviderFeatureWithNullRequestServices() [Fact] public async Task CanAccessLogger() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(context => @@ -564,6 +599,7 @@ public async Task CanAccessLogger() }); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("FoundLogger:True", result); @@ -572,6 +608,7 @@ public async Task CanAccessLogger() [Fact] public async Task CanAccessHttpContext() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(context => @@ -585,6 +622,7 @@ public async Task CanAccessHttpContext() services.AddSingleton(); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("HasContext:True", result); @@ -603,6 +641,7 @@ public ContextHolder(IHttpContextAccessor accessor) [Fact] public async Task CanAddNewHostServices() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(context => @@ -617,6 +656,7 @@ public async Task CanAddNewHostServices() services.AddSingleton(); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("HasContext:True", result); @@ -625,6 +665,7 @@ public async Task CanAddNewHostServices() [Fact] public async Task CreateInvokesApp() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(context => @@ -633,6 +674,7 @@ public async Task CreateInvokesApp() }); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("CreateInvokesApp", result); @@ -641,6 +683,7 @@ public async Task CreateInvokesApp() [Fact] public async Task DisposeStreamIgnored() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(async context => @@ -650,6 +693,7 @@ public async Task DisposeStreamIgnored() }); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); @@ -659,6 +703,7 @@ public async Task DisposeStreamIgnored() [Fact] public async Task DisposedServerThrows() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(async context => @@ -668,6 +713,7 @@ public async Task DisposedServerThrows() }); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); @@ -678,6 +724,7 @@ public async Task DisposedServerThrows() [Fact] public async Task CancelAborts() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(app => { @@ -689,6 +736,7 @@ public async Task CancelAborts() }); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete await Assert.ThrowsAsync(async () => { string result = await server.CreateClient().GetStringAsync("/path"); }); } @@ -696,9 +744,11 @@ public async Task CancelAborts() [Fact] public async Task CanCreateViaStartupType() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .UseStartup(); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("FoundService:True", await result.Content.ReadAsStringAsync()); @@ -707,10 +757,12 @@ public async Task CanCreateViaStartupType() [Fact] public async Task CanCreateViaStartupTypeAndSpecifyEnv() { +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .UseStartup() .UseEnvironment("Foo"); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); @@ -722,6 +774,7 @@ public async Task BeginEndDiagnosticAvailable() { DiagnosticListener diagnosticListener = null; +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(app => { @@ -732,6 +785,7 @@ public async Task BeginEndDiagnosticAvailable() }); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete var listener = new TestDiagnosticListener(); diagnosticListener.SubscribeWithAdapter(listener); @@ -750,6 +804,7 @@ public async Task BeginEndDiagnosticAvailable() public async Task ExceptionDiagnosticAvailable() { DiagnosticListener diagnosticListener = null; +#pragma warning disable CS0618 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { diagnosticListener = app.ApplicationServices.GetRequiredService(); @@ -759,6 +814,7 @@ public async Task ExceptionDiagnosticAvailable() }); }); var server = new TestServer(builder); +#pragma warning restore CS0618 // Type or member is obsolete var listener = new TestDiagnosticListener(); diagnosticListener.SubscribeWithAdapter(listener); @@ -784,29 +840,14 @@ public async Task ManuallySetHostWinsOverInferredHostFromRequestUri(string uri) ctx.Response.WriteAsync(ctx.Request.Headers.Host); using var host = new HostBuilder() - - .ConfigureWebHost(webBuilder => - - { - - webBuilder - - .UseTestServer() - - .Configure(app => app.Run(appDelegate)); - - }) - - .Build(); - var server = host.GetTestServer(); var client = server.CreateClient(); From 9134e94084a03fa4ce2ab40dada58c2941ead563 Mon Sep 17 00:00:00 2001 From: Brennan Date: Sun, 20 Jul 2025 18:46:43 -0700 Subject: [PATCH 16/22] startasync --- .../TestHost/test/ClientHandlerTests.cs | 2 + .../TestHost/test/HttpContextBuilderTests.cs | 14 +++ src/Hosting/TestHost/test/TestClientTests.cs | 94 +++++++------------ src/Hosting/TestHost/test/TestServerTests.cs | 2 + .../TestHost/test/WebSocketClientTests.cs | 6 ++ 5 files changed, 59 insertions(+), 59 deletions(-) diff --git a/src/Hosting/TestHost/test/ClientHandlerTests.cs b/src/Hosting/TestHost/test/ClientHandlerTests.cs index 698172bfbcc3..170310ec275a 100644 --- a/src/Hosting/TestHost/test/ClientHandlerTests.cs +++ b/src/Hosting/TestHost/test/ClientHandlerTests.cs @@ -712,6 +712,8 @@ public async Task ClientHandlerCreateContextWithDefaultRequestParameters() .Build(); var server = host.GetTestServer(); + await host.StartAsync(); + // The HttpContext will be created and the logger will make sure that the HttpRequest exists and contains reasonable values var result = await server.CreateClient().GetStringAsync("/"); } diff --git a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs index 18218c8a35a7..e1abc091e5ef 100644 --- a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs +++ b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs @@ -29,6 +29,9 @@ public async Task ExpectedValuesAreAvailable() }) .Build(); var server = host.GetTestServer(); + + await host.StartAsync(); + server.BaseAddress = new Uri("https://example.com/A/Path/"); var context = await server.SendAsync(c => { @@ -67,6 +70,9 @@ public async Task UserAgentHeaderWorks() }) .Build(); var server = host.GetTestServer(); + + await host.StartAsync(); + server.BaseAddress = new Uri("https://example.com/"); var context = await server.SendAsync(c => { @@ -89,6 +95,9 @@ public async Task SingleSlashNotMovedToPathBase() }) .Build(); var server = host.GetTestServer(); + + await host.StartAsync(); + var context = await server.SendAsync(c => { c.Request.Path = "/"; @@ -117,6 +126,9 @@ public async Task MiddlewareOnlySetsHeaders() }) .Build(); var server = host.GetTestServer(); + + await host.StartAsync(); + var context = await server.SendAsync(c => { }); Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); @@ -357,6 +369,8 @@ public async Task ClientHandlerCreateContextWithDefaultRequestParameters() .Build(); var server = host.GetTestServer(); + await host.StartAsync(); + // The HttpContext will be created and the logger will make sure that the HttpRequest exists and contains reasonable values var ctx = await server.SendAsync(c => { }); } diff --git a/src/Hosting/TestHost/test/TestClientTests.cs b/src/Hosting/TestHost/test/TestClientTests.cs index b21250de0698..59faaade2438 100644 --- a/src/Hosting/TestHost/test/TestClientTests.cs +++ b/src/Hosting/TestHost/test/TestClientTests.cs @@ -28,21 +28,16 @@ public async Task GetAsyncWorks() RequestDelegate appDelegate = ctx => ctx.Response.WriteAsync(expected); using var host = new HostBuilder() - .ConfigureWebHost(webBuilder => - { - webBuilder - .UseTestServer() - .Configure(app => app.Run(appDelegate)); - }) - .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); @@ -67,19 +62,16 @@ public async Task NoTrailingSlash_NoPathBase() using var host = new HostBuilder() .ConfigureWebHost(webBuilder => - { - webBuilder - .UseTestServer() - .Configure(app => app.Run(appDelegate)); }) - .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); @@ -101,22 +93,18 @@ public async Task SingleTrailingSlash_NoPathBase() Assert.Equal("/", ctx.Request.Path.Value); return ctx.Response.WriteAsync(expected); }; - using var host = new HostBuilder() + using var host = new HostBuilder() .ConfigureWebHost(webBuilder => - { - webBuilder - .UseTestServer() - .Configure(app => app.Run(appDelegate)); - }) - .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); @@ -139,19 +127,15 @@ public async Task PutAsyncWorks() using var host = new HostBuilder() .ConfigureWebHost(webBuilder => - { - webBuilder - .UseTestServer() - .Configure(app => app.Run(appDelegate)); - }) - .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); @@ -172,19 +156,15 @@ public async Task PostAsyncWorks() using var host = new HostBuilder() .ConfigureWebHost(webBuilder => - { - webBuilder - .UseTestServer() - .Configure(app => app.Run(appDelegate)); - }) - .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); @@ -276,6 +256,8 @@ public async Task ClientStreamingWorks() }) .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); @@ -341,6 +323,8 @@ public async Task ClientStreaming_HttpContentException() }) .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); @@ -400,6 +384,8 @@ public async Task ClientStreaming_Cancellation() }) .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); @@ -465,6 +451,8 @@ public async Task ClientStreaming_ResponseCompletesWithoutReadingRequest() }) .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); @@ -536,6 +524,9 @@ public async Task ClientStreaming_ResponseCompletesWithPendingRead_ThrowError() .Build(); var server = host.GetTestServer(); + + await host.StartAsync(); + var client = server.CreateClient(); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:12345"); @@ -590,6 +581,8 @@ public async Task ClientStreaming_ResponseCompletesWithoutResponseBodyWrite() }) .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); @@ -650,6 +643,9 @@ public async Task ClientStreaming_ServerAbort() .Build(); var server = host.GetTestServer(); + + await host.StartAsync(); + var client = server.CreateClient(); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:12345"); @@ -989,21 +985,16 @@ public async Task ClientDisposalAbortsRequest() // Act using var host = new HostBuilder() - .ConfigureWebHost(webBuilder => - { - webBuilder - .UseTestServer() - .Configure(app => app.Run(appDelegate)); - }) - .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:12345"); @@ -1112,21 +1103,16 @@ public async Task SendAsync_Default_Protocol11() await ctx.Response.WriteAsync(expected); }; using var host = new HostBuilder() - .ConfigureWebHost(webBuilder => - { - webBuilder - .UseTestServer() - .Configure(app => app.Run(appDelegate)); - }) - .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:12345"); @@ -1153,21 +1139,16 @@ public async Task SendAsync_ExplicitlySet_Protocol20() await ctx.Response.WriteAsync(expected); }; using var host = new HostBuilder() - .ConfigureWebHost(webBuilder => - { - webBuilder - .UseTestServer() - .Configure(app => app.Run(appDelegate)); - }) - .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:12345"); @@ -1195,21 +1176,16 @@ public async Task SendAsync_ExplicitlySet_Protocol30() await ctx.Response.WriteAsync(expected); }; using var host = new HostBuilder() - .ConfigureWebHost(webBuilder => - { - webBuilder - .UseTestServer() - .Configure(app => app.Run(appDelegate)); - }) - .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:12345"); diff --git a/src/Hosting/TestHost/test/TestServerTests.cs b/src/Hosting/TestHost/test/TestServerTests.cs index 7f8f23a92618..a8cc9d162cc2 100644 --- a/src/Hosting/TestHost/test/TestServerTests.cs +++ b/src/Hosting/TestHost/test/TestServerTests.cs @@ -848,6 +848,8 @@ public async Task ManuallySetHostWinsOverInferredHostFromRequestUri(string uri) }) .Build(); + await host.StartAsync(); + var server = host.GetTestServer(); var client = server.CreateClient(); diff --git a/src/Hosting/TestHost/test/WebSocketClientTests.cs b/src/Hosting/TestHost/test/WebSocketClientTests.cs index fbb36956ac8c..f3e32c28d5a2 100644 --- a/src/Hosting/TestHost/test/WebSocketClientTests.cs +++ b/src/Hosting/TestHost/test/WebSocketClientTests.cs @@ -41,6 +41,8 @@ public async Task ConnectAsync_ShouldSetRequestProperties(string requestUri, str }) .Build(); + await host.StartAsync(); + var testServer = host.GetTestServer(); var client = testServer.CreateWebSocketClient(); @@ -89,6 +91,8 @@ public async Task CanAcceptWebSocket() }) .Build(); + await host.StartAsync(); + var testServer = host.GetTestServer(); var client = testServer.CreateWebSocketClient(); @@ -129,6 +133,8 @@ public async Task VerifyWebSocketAndUpgradeFeatures() }) .Build(); + await host.StartAsync(); + var testServer = host.GetTestServer(); var client = testServer.CreateWebSocketClient(); From f6c7ee3da80e816cfd6281791d366e2204428a57 Mon Sep 17 00:00:00 2001 From: Brennan Date: Mon, 21 Jul 2025 11:19:02 -0700 Subject: [PATCH 17/22] convert --- .../Hosting/test/WebHostBuilderTests.cs | 1 - .../TestHost/test/HttpContextBuilderTests.cs | 281 +++++++++++------- .../Program.cs | 52 ++-- .../Kestrel/test/HttpsConfigurationTests.cs | 1 - 4 files changed, 208 insertions(+), 127 deletions(-) diff --git a/src/Hosting/Hosting/test/WebHostBuilderTests.cs b/src/Hosting/Hosting/test/WebHostBuilderTests.cs index f29d2f4570b7..08a5b6b116bf 100644 --- a/src/Hosting/Hosting/test/WebHostBuilderTests.cs +++ b/src/Hosting/Hosting/test/WebHostBuilderTests.cs @@ -1791,4 +1791,3 @@ public void Dispose() public void AddProvider(ILoggerProvider provider) { } } } -//#pragma warning restore CS0618 // Type or member is obsolete diff --git a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs index e1abc091e5ef..b46b2292339f 100644 --- a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs +++ b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs @@ -1,8 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -#pragma warning disable CS0618 // Type or member is obsolete - using System.Text; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -138,15 +136,21 @@ public async Task MiddlewareOnlySetsHeaders() public async Task BlockingMiddlewareShouldNotBlockClient() { var block = new ManualResetEvent(false); - var builder = new WebHostBuilder().Configure(app => - { - app.Run(c => + var builder = new HostBuilder().ConfigureWebHost(webHostBuilder => + webHostBuilder.Configure(app => { - block.WaitOne(); - return Task.FromResult(0); - }); - }); - var server = new TestServer(builder); + app.Run(c => + { + block.WaitOne(); + return Task.FromResult(0); + }); + }) + .UseTestServer()); + using var host = builder.Build(); + + await host.StartAsync(); + + var server = host.GetTestServer(); var task = server.SendAsync(c => { }); Assert.False(task.IsCompleted); @@ -161,20 +165,29 @@ public async Task BlockingMiddlewareShouldNotBlockClient() public async Task HeadersAvailableBeforeSyncBodyFinished() { var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var builder = new WebHostBuilder().Configure(app => - { - app.Run(async c => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - c.Response.Headers["TestHeader"] = "TestValue"; - var bytes = Encoding.UTF8.GetBytes("BodyStarted" + Environment.NewLine); - c.Features.Get().AllowSynchronousIO = true; - c.Response.Body.Write(bytes, 0, bytes.Length); - await block.Task; - bytes = Encoding.UTF8.GetBytes("BodyFinished"); - c.Response.Body.Write(bytes, 0, bytes.Length); - }); - }); - var server = new TestServer(builder); + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(async c => + { + c.Response.Headers["TestHeader"] = "TestValue"; + var bytes = Encoding.UTF8.GetBytes("BodyStarted" + Environment.NewLine); + c.Features.Get().AllowSynchronousIO = true; + c.Response.Body.Write(bytes, 0, bytes.Length); + await block.Task; + bytes = Encoding.UTF8.GetBytes("BodyFinished"); + c.Response.Body.Write(bytes, 0, bytes.Length); + }); + }); + }) + .Build(); + var server = host.GetTestServer(); + await host.StartAsync(); + var context = await server.SendAsync(c => { }); Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); @@ -188,17 +201,26 @@ public async Task HeadersAvailableBeforeSyncBodyFinished() public async Task HeadersAvailableBeforeAsyncBodyFinished() { var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var builder = new WebHostBuilder().Configure(app => - { - app.Run(async c => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - c.Response.Headers["TestHeader"] = "TestValue"; - await c.Response.WriteAsync("BodyStarted" + Environment.NewLine); - await block.Task; - await c.Response.WriteAsync("BodyFinished"); - }); - }); - var server = new TestServer(builder); + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(async c => + { + c.Response.Headers["TestHeader"] = "TestValue"; + await c.Response.WriteAsync("BodyStarted" + Environment.NewLine); + await block.Task; + await c.Response.WriteAsync("BodyFinished"); + }); + }); + }) + .Build(); + var server = host.GetTestServer(); + await host.StartAsync(); + var context = await server.SendAsync(c => { }); Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); @@ -212,17 +234,26 @@ public async Task HeadersAvailableBeforeAsyncBodyFinished() public async Task FlushSendsHeaders() { var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var builder = new WebHostBuilder().Configure(app => - { - app.Run(async c => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - c.Response.Headers["TestHeader"] = "TestValue"; - await c.Response.Body.FlushAsync(); - await block.Task; - await c.Response.WriteAsync("BodyFinished"); - }); - }); - var server = new TestServer(builder); + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(async c => + { + c.Response.Headers["TestHeader"] = "TestValue"; + await c.Response.Body.FlushAsync(); + await block.Task; + await c.Response.WriteAsync("BodyFinished"); + }); + }); + }) + .Build(); + var server = host.GetTestServer(); + await host.StartAsync(); + var context = await server.SendAsync(c => { }); Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); @@ -234,17 +265,26 @@ public async Task FlushSendsHeaders() public async Task ClientDisposalCloses() { var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var builder = new WebHostBuilder().Configure(app => - { - app.Run(async c => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - c.Response.Headers["TestHeader"] = "TestValue"; - await c.Response.Body.FlushAsync(); - await block.Task; - await c.Response.WriteAsync("BodyFinished"); - }); - }); - var server = new TestServer(builder); + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(async c => + { + c.Response.Headers["TestHeader"] = "TestValue"; + await c.Response.Body.FlushAsync(); + await block.Task; + await c.Response.WriteAsync("BodyFinished"); + }); + }); + }) + .Build(); + var server = host.GetTestServer(); + await host.StartAsync(); + var context = await server.SendAsync(c => { }); Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); @@ -260,17 +300,26 @@ public async Task ClientDisposalCloses() public async Task ClientCancellationAborts() { var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var builder = new WebHostBuilder().Configure(app => - { - app.Run(c => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - block.SetResult(); - Assert.True(c.RequestAborted.WaitHandle.WaitOne(TimeSpan.FromSeconds(10))); - c.RequestAborted.ThrowIfCancellationRequested(); - return Task.CompletedTask; - }); - }); - var server = new TestServer(builder); + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(c => + { + block.SetResult(); + Assert.True(c.RequestAborted.WaitHandle.WaitOne(TimeSpan.FromSeconds(10))); + c.RequestAborted.ThrowIfCancellationRequested(); + return Task.CompletedTask; + }); + }); + }) + .Build(); + var server = host.GetTestServer(); + await host.StartAsync(); + var cts = new CancellationTokenSource(); var contextTask = server.SendAsync(c => { }, cts.Token); await block.Task; @@ -283,17 +332,26 @@ public async Task ClientCancellationAborts() public async Task ClientCancellationAbortsReadAsync() { var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var builder = new WebHostBuilder().Configure(app => - { - app.Run(async c => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - c.Response.Headers["TestHeader"] = "TestValue"; - await c.Response.Body.FlushAsync(); - await block.Task; - await c.Response.WriteAsync("BodyFinished"); - }); - }); - var server = new TestServer(builder); + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(async c => + { + c.Response.Headers["TestHeader"] = "TestValue"; + await c.Response.Body.FlushAsync(); + await block.Task; + await c.Response.WriteAsync("BodyFinished"); + }); + }); + }) + .Build(); + var server = host.GetTestServer(); + await host.StartAsync(); + var context = await server.SendAsync(c => { }); Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); @@ -309,14 +367,21 @@ public async Task ClientCancellationAbortsReadAsync() [Fact] public Task ExceptionBeforeFirstWriteIsReported() { - var builder = new WebHostBuilder().Configure(app => - { - app.Run(c => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - throw new InvalidOperationException("Test Exception"); - }); - }); - var server = new TestServer(builder); + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(c => + { + throw new InvalidOperationException("Test Exception"); + }); + }); + }) + .Build(); + var server = host.GetTestServer(); return Assert.ThrowsAsync(() => server.SendAsync(c => { })); } @@ -324,17 +389,26 @@ public Task ExceptionBeforeFirstWriteIsReported() public async Task ExceptionAfterFirstWriteIsReported() { var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var builder = new WebHostBuilder().Configure(app => - { - app.Run(async c => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - c.Response.Headers["TestHeader"] = "TestValue"; - await c.Response.WriteAsync("BodyStarted"); - await block.Task; - throw new InvalidOperationException("Test Exception"); - }); - }); - var server = new TestServer(builder); + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(async c => + { + c.Response.Headers["TestHeader"] = "TestValue"; + await c.Response.WriteAsync("BodyStarted"); + await block.Task; + throw new InvalidOperationException("Test Exception"); + }); + }); + }) + .Build(); + var server = host.GetTestServer(); + await host.StartAsync(); + var context = await server.SendAsync(c => { }); Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); @@ -379,17 +453,24 @@ public async Task ClientHandlerCreateContextWithDefaultRequestParameters() public async Task CallingAbortInsideHandlerShouldSetRequestAborted() { var requestAborted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var builder = new WebHostBuilder() - .Configure(app => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - app.Run(context => - { - context.RequestAborted.Register(() => requestAborted.SetResult()); - context.Abort(); - return Task.CompletedTask; - }); - }); - var server = new TestServer(builder); + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(context => + { + context.RequestAborted.Register(() => requestAborted.SetResult()); + context.Abort(); + return Task.CompletedTask; + }); + }); + }) + .Build(); + var server = host.GetTestServer(); + await host.StartAsync(); var ex = await Assert.ThrowsAsync(() => server.SendAsync(c => { })); Assert.Equal("The application aborted the request.", ex.Message); diff --git a/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs b/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs index 4d4d6a1a95c6..99e5c6aaaaa9 100644 --- a/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs +++ b/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Hosting.Server; using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Console; @@ -22,38 +23,39 @@ public static void Main(string[] args) .AddEnvironmentVariables(prefix: "ASPNETCORE_") .Build(); -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder() - .UseServer(new NoopServer()) - .UseConfiguration(config) - .SuppressStatusMessages(true) - .ConfigureLogging((_, factory) => + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - factory.AddConsole(); - factory.AddFilter(level => level >= LogLevel.Warning); - }) - .UseStartup("Microsoft.AspNetCore.Hosting.TestSites"); -#pragma warning restore CS0618 // Type or member is obsolete + webHostBuilder.UseServer(new NoopServer()) + .UseConfiguration(config) + .SuppressStatusMessages(true) + .ConfigureLogging((_, factory) => + { + factory.AddConsole(); + factory.AddFilter(level => level >= LogLevel.Warning); + }) + .UseStartup("Microsoft.AspNetCore.Hosting.TestSites"); + }); if (config["STARTMECHANIC"] == "Run") - { - var host = builder.Build(); + { + var host = builder.Build(); - host.Run(); - } - else if (config["STARTMECHANIC"] == "WaitForShutdown") - { - using (var host = builder.Build()) + host.Run(); + } + else if (config["STARTMECHANIC"] == "WaitForShutdown") { - host.Start(); + using (var host = builder.Build()) + { + host.Start(); - host.WaitForShutdown(); + host.WaitForShutdown(); + } + } + else + { + throw new InvalidOperationException("Starting mechanic not specified"); } - } - else - { - throw new InvalidOperationException("Starting mechanic not specified"); - } } } diff --git a/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs b/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs index 55192565051e..07f9e0924811 100644 --- a/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs +++ b/src/Servers/Kestrel/Kestrel/test/HttpsConfigurationTests.cs @@ -51,7 +51,6 @@ public async Task BindAddressFromSetting(string address, bool useKestrelHttpsCon } else { - //// Binding succeeds - server is already started, so we just stop it await host.StartAsync(); var addr = Assert.Single(host.Services.GetRequiredService().Features.Get().Addresses); From 161a1b5afc5503a3c6e4efcacf47c20a980140af Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 22 Jul 2025 18:02:53 +0000 Subject: [PATCH 18/22] Convert 12 more TestServerTests to HostBuilder pattern Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- src/Hosting/TestHost/test/TestServerTests.cs | 360 +++++++++++-------- 1 file changed, 219 insertions(+), 141 deletions(-) diff --git a/src/Hosting/TestHost/test/TestServerTests.cs b/src/Hosting/TestHost/test/TestServerTests.cs index a8cc9d162cc2..54c4d4573134 100644 --- a/src/Hosting/TestHost/test/TestServerTests.cs +++ b/src/Hosting/TestHost/test/TestServerTests.cs @@ -100,13 +100,14 @@ public void CreateWithDelegate() [Fact] public void CreateWithDelegate_DI() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder() - .Configure(app => { }) - .UseTestServer(); - - using var host = builder.Build(); -#pragma warning restore CS0618 // Type or member is obsolete + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => + { + webBuilder + .UseTestServer() + .Configure(app => { }); + }) + .Build(); host.Start(); } @@ -203,16 +204,23 @@ public void ApplicationServicesAvailableFromTestServer() [Fact] public async Task RequestServicesAutoCreated() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(context => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - return context.Response.WriteAsync("RequestServices:" + (context.RequestServices != null)); - }); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(context => + { + return context.Response.WriteAsync("RequestServices:" + (context.RequestServices != null)); + }); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("RequestServices:True", result); @@ -221,19 +229,26 @@ public async Task RequestServicesAutoCreated() [Fact] public async Task DispoingTheRequestBodyDoesNotDisposeClientStreams() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(async context => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - using (var sr = new StreamReader(context.Request.Body)) - { - await context.Response.WriteAsync(await sr.ReadToEndAsync()); - } - }); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(async context => + { + using (var sr = new StreamReader(context.Request.Body)) + { + await context.Response.WriteAsync(await sr.ReadToEndAsync()); + } + }); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); var stream = new ThrowOnDisposeStream(); stream.Write(Encoding.ASCII.GetBytes("Hello World")); @@ -449,21 +464,28 @@ public Action Configure(Action next) [Fact] public async Task ExistingRequestServicesWillNotBeReplaced() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(context => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - var service = context.RequestServices.GetService(); - return context.Response.WriteAsync("Found:" + (service != null)); - }); - }) - .ConfigureServices(services => - { - services.AddTransient(); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(context => + { + var service = context.RequestServices.GetService(); + return context.Response.WriteAsync("Found:" + (service != null)); + }); + }) + .ConfigureServices(services => + { + services.AddTransient(); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Found:True", result); @@ -472,22 +494,29 @@ public async Task ExistingRequestServicesWillNotBeReplaced() [Fact] public async Task CanSetCustomServiceProvider() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(context => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - context.RequestServices = new ServiceCollection() - .AddTransient() - .BuildServiceProvider(); + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(context => + { + context.RequestServices = new ServiceCollection() + .AddTransient() + .BuildServiceProvider(); - var s = context.RequestServices.GetRequiredService(); + var s = context.RequestServices.GetRequiredService(); - return context.Response.WriteAsync("Success"); - }); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + return context.Response.WriteAsync("Success"); + }); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Success", result); @@ -523,21 +552,28 @@ public Action Configure(Action next) public async Task ExistingServiceProviderFeatureWillNotBeReplaced() { var appServices = new ServiceCollection().BuildServiceProvider(); -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(context => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - Assert.Equal(appServices, context.RequestServices); - return context.Response.WriteAsync("Success"); - }); - }) - .ConfigureServices(services => - { - services.AddSingleton(new ReplaceServiceProvidersFeatureFilter(appServices, appServices)); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(context => + { + Assert.Equal(appServices, context.RequestServices); + return context.Response.WriteAsync("Success"); + }); + }) + .ConfigureServices(services => + { + services.AddSingleton(new ReplaceServiceProvidersFeatureFilter(appServices, appServices)); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); var result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Success", result); @@ -566,21 +602,28 @@ public Action Configure(Action next) [Fact] public async Task WillReplaceServiceProviderFeatureWithNullRequestServices() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(context => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - Assert.Null(context.RequestServices); - return context.Response.WriteAsync("Success"); - }); - }) - .ConfigureServices(services => - { - services.AddTransient(); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(context => + { + Assert.Null(context.RequestServices); + return context.Response.WriteAsync("Success"); + }); + }) + .ConfigureServices(services => + { + services.AddTransient(); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); var result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Success", result); @@ -589,17 +632,24 @@ public async Task WillReplaceServiceProviderFeatureWithNullRequestServices() [Fact] public async Task CanAccessLogger() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(context => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - var logger = app.ApplicationServices.GetRequiredService>(); - return context.Response.WriteAsync("FoundLogger:" + (logger != null)); - }); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(context => + { + var logger = app.ApplicationServices.GetRequiredService>(); + return context.Response.WriteAsync("FoundLogger:" + (logger != null)); + }); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("FoundLogger:True", result); @@ -608,21 +658,28 @@ public async Task CanAccessLogger() [Fact] public async Task CanAccessHttpContext() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(context => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - var accessor = app.ApplicationServices.GetRequiredService(); - return context.Response.WriteAsync("HasContext:" + (accessor.HttpContext != null)); - }); - }) - .ConfigureServices(services => - { - services.AddSingleton(); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(context => + { + var accessor = app.ApplicationServices.GetRequiredService(); + return context.Response.WriteAsync("HasContext:" + (accessor.HttpContext != null)); + }); + }) + .ConfigureServices(services => + { + services.AddSingleton(); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("HasContext:True", result); @@ -641,22 +698,29 @@ public ContextHolder(IHttpContextAccessor accessor) [Fact] public async Task CanAddNewHostServices() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(context => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - var accessor = app.ApplicationServices.GetRequiredService(); - return context.Response.WriteAsync("HasContext:" + (accessor.Accessor.HttpContext != null)); - }); - }) - .ConfigureServices(services => - { - services.AddSingleton(); - services.AddSingleton(); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(context => + { + var accessor = app.ApplicationServices.GetRequiredService(); + return context.Response.WriteAsync("HasContext:" + (accessor.Accessor.HttpContext != null)); + }); + }) + .ConfigureServices(services => + { + services.AddSingleton(); + services.AddSingleton(); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("HasContext:True", result); @@ -665,16 +729,23 @@ public async Task CanAddNewHostServices() [Fact] public async Task CreateInvokesApp() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(context => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - return context.Response.WriteAsync("CreateInvokesApp"); - }); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(context => + { + return context.Response.WriteAsync("CreateInvokesApp"); + }); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("CreateInvokesApp", result); @@ -683,17 +754,24 @@ public async Task CreateInvokesApp() [Fact] public async Task DisposeStreamIgnored() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(async context => + using var host = new HostBuilder() + .ConfigureWebHost(webBuilder => { - await context.Response.WriteAsync("Response"); - context.Response.Body.Dispose(); - }); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + webBuilder + .UseTestServer() + .Configure(app => + { + app.Run(async context => + { + await context.Response.WriteAsync("Response"); + context.Response.Body.Dispose(); + }); + }); + }) + .Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); From 5279775e2c84dd5aba991527c8f3ae7af66e5279 Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 23 Jul 2025 13:48:42 -0700 Subject: [PATCH 19/22] testservertests --- src/Hosting/TestHost/test/TestClientTests.cs | 236 +++++++++++------- src/Hosting/TestHost/test/TestServerTests.cs | 132 ++++++---- .../Program.cs | 28 +-- 3 files changed, 249 insertions(+), 147 deletions(-) diff --git a/src/Hosting/TestHost/test/TestClientTests.cs b/src/Hosting/TestHost/test/TestClientTests.cs index 59faaade2438..b14a6186fdcb 100644 --- a/src/Hosting/TestHost/test/TestClientTests.cs +++ b/src/Hosting/TestHost/test/TestClientTests.cs @@ -188,8 +188,6 @@ public async Task LargePayload_DisposesRequest_AfterResponseIsCompleted() data[i] = character[0]; } -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder(); RequestDelegate app = async ctx => { var disposable = new TestDisposable(); @@ -201,9 +199,17 @@ public async Task LargePayload_DisposesRequest_AfterResponseIsCompleted() await ctx.Response.Body.WriteAsync(data, 1024, 1024); }; - builder.Configure(appBuilder => appBuilder.Run(app)); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + var builder = new HostBuilder() + .ConfigureWebHost(webBuilder => + { + webBuilder + .UseTestServer() + .Configure(appBuilder => appBuilder.Run(app)); + }); + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); var client = server.CreateClient(); // Act & Assert @@ -728,18 +734,25 @@ public async Task WebSocketWorks() } } }; -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder() - .ConfigureServices(services => - { - services.AddSingleton>(logger); - }) - .Configure(app => + + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - app.Run(appDelegate); + webHostBuilder + .UseTestServer() + .ConfigureServices(services => + { + services.AddSingleton>(logger); + }) + .Configure(app => + { + app.Run(appDelegate); + }); }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + using var host = builder.Build(); + + await host.StartAsync(); + var server = host.GetTestServer(); // Act var client = server.CreateWebSocketClient(); @@ -800,13 +813,18 @@ public async Task WebSocketSubProtocolsWorks() } } }; -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder() - .Configure(app => + + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - app.Run(appDelegate); + webHostBuilder + .UseTestServer() + .Configure(app => app.Run(appDelegate)); }); - var server = new TestServer(builder); + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); #pragma warning restore CS0618 // Type or member is obsolete // Act @@ -854,12 +872,19 @@ public async Task WebSocketAcceptThrowsWhenCancelled() } } }; -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder() - .ConfigureServices(services => services.AddSingleton>(logger)) - .Configure(app => app.Run(appDelegate)); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseTestServer() + .ConfigureServices(services => services.AddSingleton>(logger)) + .Configure(app => app.Run(appDelegate)); + }); + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); // Act var client = server.CreateWebSocketClient(); @@ -899,13 +924,18 @@ public async Task WebSocketDisposalThrowsOnPeer() websocket.Dispose(); } }; -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(appDelegate); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseTestServer() + .Configure(app => app.Run(appDelegate)); + }); + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); // Act var client = server.CreateWebSocketClient(); @@ -934,13 +964,18 @@ public async Task WebSocketTinyReceiveGeneratesEndOfMessage() } } }; -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - app.Run(appDelegate); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + { + webHostBuilder + .UseTestServer() + .Configure(app => app.Run(appDelegate)); + }); + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); // Act var client = server.CreateWebSocketClient(); @@ -1010,23 +1045,31 @@ public async Task ClientDisposalAbortsRequest() public async Task ClientCancellationAbortsRequest() { var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => app.Run(async ctx => - { - try - { - await Task.Delay(TimeSpan.FromSeconds(30), ctx.RequestAborted); - tcs.SetResult(); - } - catch (Exception e) + + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - tcs.SetException(e); - return; - } - throw new InvalidOperationException("The request was not aborted"); - })); - using var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + webHostBuilder + .UseTestServer() + .Configure(app => app.Run(async ctx => + { + try + { + await Task.Delay(TimeSpan.FromSeconds(30), ctx.RequestAborted); + tcs.SetResult(); + } + catch (Exception e) + { + tcs.SetException(e); + return; + } + throw new InvalidOperationException("The request was not aborted"); + })); + }); + using var host = builder.Build(); + await host.StartAsync(); + + using var server = host.GetTestServer(); using var client = server.CreateClient(); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1)); var response = await Assert.ThrowsAnyAsync(() => client.GetAsync("http://localhost:12345", cts.Token)); @@ -1042,18 +1085,25 @@ public async Task AsyncLocalValueOnClientIsNotPreserved() asyncLocal.Value = value; object capturedValue = null; -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder() - .Configure(app => + + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - app.Run((context) => - { - capturedValue = asyncLocal.Value; - return context.Response.WriteAsync("Done"); - }); + webHostBuilder + .UseTestServer() + .Configure(app => + { + app.Run((context) => + { + capturedValue = asyncLocal.Value; + return context.Response.WriteAsync("Done"); + }); + }); }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); var client = server.CreateClient(); var resp = await client.GetAsync("/"); @@ -1069,21 +1119,28 @@ public async Task AsyncLocalValueOnClientIsPreservedIfPreserveExecutionContextIs asyncLocal.Value = value; object capturedValue = null; -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder() - .Configure(app => + + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => { - app.Run((context) => - { - capturedValue = asyncLocal.Value; - return context.Response.WriteAsync("Done"); - }); + webHostBuilder + .UseTestServer(o => + { + o.PreserveExecutionContext = true; + }) + .Configure(app => + { + app.Run((context) => + { + capturedValue = asyncLocal.Value; + return context.Response.WriteAsync("Done"); + }); + }); }); - var server = new TestServer(builder) - { - PreserveExecutionContext = true - }; -#pragma warning restore CS0618 // Type or member is obsolete + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); var client = server.CreateClient(); var resp = await client.GetAsync("/"); @@ -1204,8 +1261,10 @@ public async Task SendAsync_ExplicitlySet_Protocol30() [Fact] public async Task VerifyWebSocketAndUpgradeFeaturesForNonWebSocket() { -#pragma warning disable CS0618 // Type or member is obsolete - using (var testServer = new TestServer(new WebHostBuilder() + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + webHostBuilder + .UseTestServer() .Configure(app => { app.UseWebSockets(); @@ -1223,13 +1282,14 @@ public async Task VerifyWebSocketAndUpgradeFeaturesForNonWebSocket() await c.Response.WriteAsync("test"); }); - }))) -#pragma warning restore CS0618 // Type or member is obsolete - { - var client = testServer.CreateClient(); + })); + using var host = builder.Build(); + await host.StartAsync(); - var actual = await client.GetStringAsync("http://localhost:12345/"); - Assert.Equal("test", actual); - } + var testServer = host.GetTestServer(); + var client = testServer.CreateClient(); + + var actual = await client.GetStringAsync("http://localhost:12345/"); + Assert.Equal("test", actual); } } diff --git a/src/Hosting/TestHost/test/TestServerTests.cs b/src/Hosting/TestHost/test/TestServerTests.cs index 54c4d4573134..9978a9cb24de 100644 --- a/src/Hosting/TestHost/test/TestServerTests.cs +++ b/src/Hosting/TestHost/test/TestServerTests.cs @@ -201,6 +201,27 @@ public void ApplicationServicesAvailableFromTestServer() Assert.Equal(testService, server.Host.Services.GetRequiredService()); } + [Fact] + public async Task ApplicationServicesAvailableFromTestServer_GenericHost() + { + var testService = new TestService(); + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + webHostBuilder + .UseTestServer() + .Configure(app => { }) + .ConfigureServices(services => + { + services.AddSingleton(testService); + })); + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); + + Assert.Equal(testService, server.Services.GetRequiredService()); + } + [Fact] public async Task RequestServicesAutoCreated() { @@ -802,19 +823,23 @@ public async Task DisposedServerThrows() [Fact] public async Task CancelAborts() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder() - .Configure(app => - { - app.Run(context => - { - TaskCompletionSource tcs = new TaskCompletionSource(); - tcs.SetCanceled(); - return tcs.Task; - }); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + webHostBuilder + .UseTestServer() + .Configure(app => + { + app.Run(context => + { + TaskCompletionSource tcs = new TaskCompletionSource(); + tcs.SetCanceled(); + return tcs.Task; + }); + })); + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); await Assert.ThrowsAsync(async () => { string result = await server.CreateClient().GetStringAsync("/path"); }); } @@ -822,11 +847,15 @@ public async Task CancelAborts() [Fact] public async Task CanCreateViaStartupType() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder() - .UseStartup(); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + webHostBuilder + .UseTestServer() + .UseStartup()); + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("FoundService:True", await result.Content.ReadAsStringAsync()); @@ -835,12 +864,16 @@ public async Task CanCreateViaStartupType() [Fact] public async Task CanCreateViaStartupTypeAndSpecifyEnv() { -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder() - .UseStartup() - .UseEnvironment("Foo"); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + webHostBuilder + .UseTestServer() + .UseStartup() + .UseEnvironment("Foo")); + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); @@ -852,18 +885,22 @@ public async Task BeginEndDiagnosticAvailable() { DiagnosticListener diagnosticListener = null; -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder() - .Configure(app => + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + webHostBuilder + .UseTestServer() + .Configure(app => + { + diagnosticListener = app.ApplicationServices.GetRequiredService(); + app.Run(context => { - diagnosticListener = app.ApplicationServices.GetRequiredService(); - app.Run(context => - { - return context.Response.WriteAsync("Hello World"); - }); + return context.Response.WriteAsync("Hello World"); }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + })); + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); var listener = new TestDiagnosticListener(); diagnosticListener.SubscribeWithAdapter(listener); @@ -882,17 +919,22 @@ public async Task BeginEndDiagnosticAvailable() public async Task ExceptionDiagnosticAvailable() { DiagnosticListener diagnosticListener = null; -#pragma warning disable CS0618 // Type or member is obsolete - var builder = new WebHostBuilder().Configure(app => - { - diagnosticListener = app.ApplicationServices.GetRequiredService(); - app.Run(context => - { - throw new Exception("Test exception"); - }); - }); - var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete + var builder = new HostBuilder() + .ConfigureWebHost(webHostBuilder => + webHostBuilder + .UseTestServer() + .Configure(app => + { + diagnosticListener = app.ApplicationServices.GetRequiredService(); + app.Run(context => + { + throw new Exception("Test exception"); + }); + })); + using var host = builder.Build(); + await host.StartAsync(); + + var server = host.GetTestServer(); var listener = new TestDiagnosticListener(); diagnosticListener.SubscribeWithAdapter(listener); diff --git a/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs b/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs index 99e5c6aaaaa9..a3d3b1581770 100644 --- a/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs +++ b/src/Hosting/test/testassets/Microsoft.AspNetCore.Hosting.TestSites/Program.cs @@ -38,24 +38,24 @@ public static void Main(string[] args) }); if (config["STARTMECHANIC"] == "Run") - { - var host = builder.Build(); + { + var host = builder.Build(); - host.Run(); - } - else if (config["STARTMECHANIC"] == "WaitForShutdown") + host.Run(); + } + else if (config["STARTMECHANIC"] == "WaitForShutdown") + { + using (var host = builder.Build()) { - using (var host = builder.Build()) - { - host.Start(); + host.Start(); - host.WaitForShutdown(); - } - } - else - { - throw new InvalidOperationException("Starting mechanic not specified"); + host.WaitForShutdown(); } + } + else + { + throw new InvalidOperationException("Starting mechanic not specified"); + } } } From ac089988350405a17177987dfab467ab28a580a4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 24 Jul 2025 19:37:48 +0000 Subject: [PATCH 20/22] Update WebHostBuilder obsolete attribute to use ASPDEPR004 diagnostic ID Co-authored-by: BrennanConroy <7574801+BrennanConroy@users.noreply.github.com> --- src/DefaultBuilder/src/WebHost.cs | 4 +- src/Hosting/Hosting/src/WebHostBuilder.cs | 2 +- .../Hosting/test/WebHostBuilderTests.cs | 16 +++---- src/Hosting/Hosting/test/WebHostTests.cs | 4 +- src/Hosting/TestHost/test/TestServerTests.cs | 44 +++++++++---------- .../test/WebHostServiceTests.cs | 8 ++-- .../IStartupInjectionAssemblyName/Program.cs | 4 +- .../testassets/InProcessWebSite/Program.cs | 24 +++++----- 8 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/DefaultBuilder/src/WebHost.cs b/src/DefaultBuilder/src/WebHost.cs index d1c8ab15a03a..1c3b9b4f07fe 100644 --- a/src/DefaultBuilder/src/WebHost.cs +++ b/src/DefaultBuilder/src/WebHost.cs @@ -154,9 +154,9 @@ public static IWebHostBuilder CreateDefaultBuilder() => /// The initialized . public static IWebHostBuilder CreateDefaultBuilder(string[] args) { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder(); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete if (string.IsNullOrEmpty(builder.GetSetting(WebHostDefaults.ContentRootKey))) { diff --git a/src/Hosting/Hosting/src/WebHostBuilder.cs b/src/Hosting/Hosting/src/WebHostBuilder.cs index 2a60026c3764..0f223446997d 100644 --- a/src/Hosting/Hosting/src/WebHostBuilder.cs +++ b/src/Hosting/Hosting/src/WebHostBuilder.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Hosting; /// /// A builder for /// -[Obsolete("TODO: Add Obsolete message")] +[Obsolete("WebHostBuilder is deprecated in favor or HostBuilder and WebApplicationBuilder. For more information, visit https://aka.ms/aspnet/deprecate/004.", DiagnosticId = "ASPDEPR004")] public class WebHostBuilder : IWebHostBuilder { private readonly HostingEnvironment _hostingEnvironment; diff --git a/src/Hosting/Hosting/test/WebHostBuilderTests.cs b/src/Hosting/Hosting/test/WebHostBuilderTests.cs index 08a5b6b116bf..b5e1f3b0563e 100644 --- a/src/Hosting/Hosting/test/WebHostBuilderTests.cs +++ b/src/Hosting/Hosting/test/WebHostBuilderTests.cs @@ -429,7 +429,7 @@ public void DoNotCaptureStartupErrorsByDefault(IWebHostBuilder builder) public void ServiceProviderDisposedOnBuildException() { var service = new DisposableService(); -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var hostBuilder = new WebHostBuilder() .UseServer(new TestServer()) .ConfigureServices(services => @@ -438,7 +438,7 @@ public void ServiceProviderDisposedOnBuildException() services.AddSingleton(sp => service); }) .UseStartup(); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete Assert.Throws(() => hostBuilder.Build()); Assert.True(service.Disposed); @@ -1485,18 +1485,18 @@ private IWebHostBuilder CreateWebHostBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete return new WebHostBuilder().UseConfiguration(config); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete } -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete public static TheoryData DefaultWebHostBuilders => new TheoryData { new WebHostBuilder(), new GenericWebHostBuilderWrapper(new HostBuilder()) }; -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete public static TheoryData DefaultWebHostBuildersWithConfig { @@ -1512,12 +1512,12 @@ public static TheoryData DefaultWebHostBuildersWithConfig .AddInMemoryCollection(vals); var config = builder.Build(); -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete return new TheoryData { new WebHostBuilder().UseConfiguration(config), new GenericWebHostBuilderWrapper(new HostBuilder()).UseConfiguration(config) }; -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete } } diff --git a/src/Hosting/Hosting/test/WebHostTests.cs b/src/Hosting/Hosting/test/WebHostTests.cs index cae78cb63c10..36bb6a960e77 100644 --- a/src/Hosting/Hosting/test/WebHostTests.cs +++ b/src/Hosting/Hosting/test/WebHostTests.cs @@ -1103,9 +1103,9 @@ private IWebHost CreateHost(RequestDelegate requestDelegate) private IWebHostBuilder CreateBuilder(IConfiguration config = null) { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete return new WebHostBuilder().UseConfiguration(config ?? new ConfigurationBuilder().Build()).UseStartup("Microsoft.AspNetCore.Hosting.Tests"); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete } private static bool[] RegisterCallbacksThatThrow(IServiceCollection services) diff --git a/src/Hosting/TestHost/test/TestServerTests.cs b/src/Hosting/TestHost/test/TestServerTests.cs index 9978a9cb24de..4cd798ae3e89 100644 --- a/src/Hosting/TestHost/test/TestServerTests.cs +++ b/src/Hosting/TestHost/test/TestServerTests.cs @@ -92,9 +92,9 @@ public void CreateWithDelegate() { // Arrange // Act & Assert (Does not throw) -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete new TestServer(new WebHostBuilder().Configure(app => { })); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete } [Fact] @@ -114,7 +114,7 @@ public void CreateWithDelegate_DI() [Fact] public void DoesNotCaptureStartupErrorsByDefault() { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(app => { @@ -122,13 +122,13 @@ public void DoesNotCaptureStartupErrorsByDefault() }); Assert.Throws(() => new TestServer(builder)); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete } [Fact] public async Task ServicesCanBeOverridenForTestingAsync() { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder() .ConfigureServices(s => s.AddSingleton, ThirdPartyContainerServiceProviderFactory>()) .UseStartup() @@ -136,7 +136,7 @@ public async Task ServicesCanBeOverridenForTestingAsync() .ConfigureTestContainer(container => container.Services.AddSingleton(new TestService { Message = "OverridesConfigureContainer" })); var host = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete var response = await host.CreateClient().GetStringAsync("/"); @@ -171,7 +171,7 @@ public class ThirdPartyContainerServiceProviderFactory : IServiceProviderFactory [Fact] public void CaptureStartupErrorsSettingPreserved() { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder() .CaptureStartupErrors(true) .Configure(app => @@ -181,14 +181,14 @@ public void CaptureStartupErrorsSettingPreserved() // Does not throw new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete } [Fact] public void ApplicationServicesAvailableFromTestServer() { var testService = new TestService(); -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(app => { }) .ConfigureServices(services => @@ -196,7 +196,7 @@ public void ApplicationServicesAvailableFromTestServer() services.AddSingleton(testService); }); var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete Assert.Equal(testService, server.Host.Services.GetRequiredService()); } @@ -302,10 +302,10 @@ public void Configure(IApplicationBuilder app) [Fact] public async Task CustomServiceProviderSetsApplicationServices() { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder().UseStartup(); var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("ApplicationServicesEqual:True", result); } @@ -315,7 +315,7 @@ public void TestServerConstructorWithFeatureCollectionAllowsInitializingServerFe { // Arrange var url = "http://localhost:8000/appName/serviceName"; -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder() .UseUrls(url) .Configure(applicationBuilder => @@ -323,7 +323,7 @@ public void TestServerConstructorWithFeatureCollectionAllowsInitializingServerFe var serverAddressesFeature = applicationBuilder.ServerFeatures.Get(); Assert.Contains(serverAddressesFeature.Addresses, s => string.Equals(s, url, StringComparison.Ordinal)); }); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete var featureCollection = new FeatureCollection(); featureCollection.Set(new ServerAddressesFeature()); @@ -339,7 +339,7 @@ public void TestServerConstructorWithFeatureCollectionAllowsInitializingServerFe public void TestServerConstructedWithoutFeatureCollectionHasServerAddressesFeature() { // Arrange -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(applicationBuilder => { @@ -349,7 +349,7 @@ public void TestServerConstructedWithoutFeatureCollectionHasServerAddressesFeatu // Act new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete // Assert // Is inside configure callback @@ -358,12 +358,12 @@ public void TestServerConstructedWithoutFeatureCollectionHasServerAddressesFeatu [Fact] public void TestServerConstructorWithNullFeatureCollectionThrows() { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder() .Configure(b => { }); Assert.Throws(() => new TestServer(builder, null)); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete } [Fact] @@ -384,14 +384,14 @@ public void TestServerConstructorShouldProvideServicesFromWebHost() { // Arrange var testService = new TestService(); -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder() .ConfigureServices(services => services.AddSingleton(testService)) .Configure(_ => { }); // Act var testServer = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete // Assert Assert.Equal(testService, testServer.Services.GetService()); @@ -802,7 +802,7 @@ public async Task DisposeStreamIgnored() [Fact] public async Task DisposedServerThrows() { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder().Configure(app => { app.Run(async context => @@ -812,7 +812,7 @@ public async Task DisposedServerThrows() }); }); var server = new TestServer(builder); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); diff --git a/src/Hosting/WindowsServices/test/WebHostServiceTests.cs b/src/Hosting/WindowsServices/test/WebHostServiceTests.cs index 9d64fd3095c2..6d428ac4cbac 100644 --- a/src/Hosting/WindowsServices/test/WebHostServiceTests.cs +++ b/src/Hosting/WindowsServices/test/WebHostServiceTests.cs @@ -19,9 +19,9 @@ public class WebHostServiceTests [ConditionalFact] public async Task StopBeforeServiceStarted() { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var host = new WebHostBuilder().UseServer(new FakeServer()).Configure(x => { }).Build(); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete var webHostService = new WebHostService(host); var applicationLifetime = host.Services.GetRequiredService(); @@ -35,9 +35,9 @@ await Assert.ThrowsAsync( [ConditionalFact] public async Task StopAfterServiceStarted() { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var host = new WebHostBuilder().UseServer(new FakeServer()).Configure(x => { }).Build(); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete var webHostService = new WebHostService(host); var applicationLifetime = host.Services.GetRequiredService(); diff --git a/src/Hosting/test/testassets/IStartupInjectionAssemblyName/Program.cs b/src/Hosting/test/testassets/IStartupInjectionAssemblyName/Program.cs index 7722483489cf..7735af5408e7 100644 --- a/src/Hosting/test/testassets/IStartupInjectionAssemblyName/Program.cs +++ b/src/Hosting/test/testassets/IStartupInjectionAssemblyName/Program.cs @@ -18,9 +18,9 @@ public static void Main(string[] args) // Do not change the signature of this method. It's used for tests. private static IWebHostBuilder CreateWebHostBuilder(string[] args) => -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete new WebHostBuilder() .SuppressStatusMessages(true) .ConfigureServices(services => services.AddSingleton()); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete } diff --git a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs index 8b02a3a902b8..72d339ba511f 100644 --- a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs +++ b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Program.cs @@ -56,12 +56,12 @@ public static int Main(string[] args) return 12; case "HangOnStop": { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var host = new WebHostBuilder() .UseIIS() .UseStartup() .Build(); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete host.Run(); Thread.Sleep(Timeout.Infinite); @@ -69,13 +69,13 @@ public static int Main(string[] args) break; case "IncreaseShutdownLimit": { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var host = new WebHostBuilder() .UseIIS() .UseShutdownTimeout(TimeSpan.FromSeconds(120)) .UseStartup() .Build(); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete host.Run(); } @@ -98,13 +98,13 @@ public static int Main(string[] args) return 0; case "OverriddenServer": { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var host = new WebHostBuilder() .UseIIS() .ConfigureServices(services => services.AddSingleton()) .Configure(builder => builder.Run(async context => { await context.Response.WriteAsync("I shouldn't work"); })) .Build(); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete host.Run(); } break; @@ -117,7 +117,7 @@ public static int Main(string[] args) #if !FORWARDCOMPAT case "DecreaseRequestLimit": { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var host = new WebHostBuilder() .ConfigureLogging((_, factory) => { @@ -131,7 +131,7 @@ public static int Main(string[] args) }) .UseStartup() .Build(); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete host.Run(); break; @@ -139,7 +139,7 @@ public static int Main(string[] args) #endif case "ThrowInStartup": { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var host = new WebHostBuilder() .ConfigureLogging((_, factory) => { @@ -149,7 +149,7 @@ public static int Main(string[] args) .UseIIS() .UseStartup() .Build(); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete host.Run(); } @@ -199,7 +199,7 @@ public static int Main(string[] args) private static int StartServer() { -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var host = new WebHostBuilder() .ConfigureLogging((_, factory) => { @@ -211,7 +211,7 @@ private static int StartServer() .UseIISIntegration() .UseStartup() .Build(); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete host.Run(); return 0; From d63a4a8c840b623e46f251c673ade61b9188250d Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 24 Jul 2025 13:09:27 -0700 Subject: [PATCH 21/22] Apply suggestions from code review --- .../Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs | 4 ++-- src/Hosting/Hosting/src/WebHostBuilder.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs b/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs index d5b709f57231..073fea0e775e 100644 --- a/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs +++ b/src/DataProtection/DataProtection/test/Microsoft.AspNetCore.DataProtection.Tests/HostingTests.cs @@ -25,7 +25,7 @@ public async Task WebhostLoadsKeyRingBeforeServerStarts() .Returns(Mock.Of()) .Callback(() => tcs.TrySetResult()); -#pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable ASPDEPR004 // Type or member is obsolete var builder = new WebHostBuilder() .UseStartup() .ConfigureServices(s => @@ -34,7 +34,7 @@ public async Task WebhostLoadsKeyRingBeforeServerStarts() .Replace(ServiceDescriptor.Singleton(mockKeyRing.Object)) .AddSingleton( new FakeServer(onStart: () => tcs.TrySetException(new InvalidOperationException("Server was started before key ring was initialized"))))); -#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore ASPDEPR004 // Type or member is obsolete using (var host = builder.Build()) { diff --git a/src/Hosting/Hosting/src/WebHostBuilder.cs b/src/Hosting/Hosting/src/WebHostBuilder.cs index 0f223446997d..23d57a3e59ac 100644 --- a/src/Hosting/Hosting/src/WebHostBuilder.cs +++ b/src/Hosting/Hosting/src/WebHostBuilder.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Hosting; /// /// A builder for /// -[Obsolete("WebHostBuilder is deprecated in favor or HostBuilder and WebApplicationBuilder. For more information, visit https://aka.ms/aspnet/deprecate/004.", DiagnosticId = "ASPDEPR004")] +[Obsolete("WebHostBuilder is deprecated in favor of HostBuilder and WebApplicationBuilder. For more information, visit https://aka.ms/aspnet/deprecate/004.", DiagnosticId = "ASPDEPR004")] public class WebHostBuilder : IWebHostBuilder { private readonly HostingEnvironment _hostingEnvironment; From c151d244e4560dce7b95916edb27809634131b64 Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 24 Jul 2025 15:50:22 -0700 Subject: [PATCH 22/22] Update src/Hosting/TestHost/test/TestClientTests.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/Hosting/TestHost/test/TestClientTests.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Hosting/TestHost/test/TestClientTests.cs b/src/Hosting/TestHost/test/TestClientTests.cs index b14a6186fdcb..2993c53e9aa6 100644 --- a/src/Hosting/TestHost/test/TestClientTests.cs +++ b/src/Hosting/TestHost/test/TestClientTests.cs @@ -825,8 +825,6 @@ public async Task WebSocketSubProtocolsWorks() await host.StartAsync(); var server = host.GetTestServer(); -#pragma warning restore CS0618 // Type or member is obsolete - // Act var client = server.CreateWebSocketClient(); client.SubProtocols.Add("alpha");