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"); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy