Skip to content

Mark WebHostBuilder class as obsolete #62785

New issue

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

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

Already on GitHub? Sign in to your account

Draft
wants to merge 16 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public async Task WebhostLoadsKeyRingBeforeServerStarts()
.Returns(Mock.Of<IKeyRing>())
.Callback(() => tcs.TrySetResult());

#pragma warning disable CS0618 // Type or member is obsolete
var builder = new WebHostBuilder()
.UseStartup<TestStartup>()
.ConfigureServices(s =>
Expand All @@ -33,6 +34,7 @@ public async Task WebhostLoadsKeyRingBeforeServerStarts()
.Replace(ServiceDescriptor.Singleton(mockKeyRing.Object))
.AddSingleton<IServer>(
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())
{
Expand Down
2 changes: 2 additions & 0 deletions src/DefaultBuilder/src/WebHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,9 @@ public static IWebHostBuilder CreateDefaultBuilder() =>
/// <returns>The initialized <see cref="IWebHostBuilder"/>.</returns>
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)))
{
Expand Down
1 change: 1 addition & 0 deletions src/Hosting/Hosting/src/WebHostBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ namespace Microsoft.AspNetCore.Hosting;
/// <summary>
/// A builder for <see cref="IWebHost"/>
/// </summary>
[Obsolete("TODO: Add Obsolete message")]
public class WebHostBuilder : IWebHostBuilder
{
private readonly HostingEnvironment _hostingEnvironment;
Expand Down
9 changes: 9 additions & 0 deletions src/Hosting/Hosting/test/WebHostBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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 =>
Expand All @@ -437,6 +438,7 @@ public void ServiceProviderDisposedOnBuildException()
services.AddSingleton(sp => service);
})
.UseStartup<StartupWithResolvedDisposableThatThrows>();
#pragma warning restore CS0618 // Type or member is obsolete

Assert.Throws<InvalidOperationException>(() => hostBuilder.Build());
Assert.True(service.Disposed);
Expand Down Expand Up @@ -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<IWebHostBuilder> DefaultWebHostBuilders => new TheoryData<IWebHostBuilder>
{
new WebHostBuilder(),
new GenericWebHostBuilderWrapper(new HostBuilder())
};
#pragma warning restore CS0618 // Type or member is obsolete

public static TheoryData<IWebHostBuilder> DefaultWebHostBuildersWithConfig
{
Expand All @@ -1506,10 +1512,12 @@ public static TheoryData<IWebHostBuilder> DefaultWebHostBuildersWithConfig
.AddInMemoryCollection(vals);
var config = builder.Build();

#pragma warning disable CS0618 // Type or member is obsolete
return new TheoryData<IWebHostBuilder> {
new WebHostBuilder().UseConfiguration(config),
new GenericWebHostBuilderWrapper(new HostBuilder()).UseConfiguration(config)
};
#pragma warning restore CS0618 // Type or member is obsolete
}
}

Expand Down Expand Up @@ -1783,3 +1791,4 @@ public void Dispose()
public void AddProvider(ILoggerProvider provider) { }
}
}
//#pragma warning restore CS0618 // Type or member is obsolete
2 changes: 2 additions & 0 deletions src/Hosting/Hosting/test/WebHostTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
31 changes: 20 additions & 11 deletions src/Hosting/TestHost/test/ClientHandlerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -691,19 +692,27 @@ 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<ILogger<IWebHost>>(logger);
webHostBuilder
.UseTestServer()
.ConfigureServices(services =>
{
services.AddSingleton<ILogger<IWebHost>>(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();

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("/");
Expand Down
101 changes: 76 additions & 25 deletions src/Hosting/TestHost/test/HttpContextBuilderTests.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
// 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;
using Microsoft.AspNetCore.Http;
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;
Expand All @@ -17,8 +20,18 @@ 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();

await host.StartAsync();

server.BaseAddress = new Uri("https://example.com/A/Path/");
var context = await server.SendAsync(c =>
{
Expand Down Expand Up @@ -48,8 +61,18 @@ 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();

await host.StartAsync();

server.BaseAddress = new Uri("https://example.com/");
var context = await server.SendAsync(c =>
{
Expand All @@ -63,8 +86,18 @@ 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();

await host.StartAsync();

var context = await server.SendAsync(c =>
{
c.Request.Path = "/";
Expand All @@ -77,15 +110,25 @@ 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();

await host.StartAsync();

var context = await server.SendAsync(c => { });

Assert.Equal("TestValue", context.Response.Headers["TestHeader"]);
Expand Down Expand Up @@ -306,19 +349,27 @@ 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<ILogger<IWebHost>>(logger);
webBuilder
.UseTestServer()
.ConfigureServices(services =>
{
services.AddSingleton<ILogger<IWebHost>>(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();

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 => { });
Expand Down
34 changes: 28 additions & 6 deletions src/Hosting/TestHost/test/RequestBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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 =>
Expand All @@ -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 =>
Expand All @@ -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("/");
Expand Down
Loading
Loading