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