如何托管 ASP.NET Core Web 应用程序并对其运行请求?我尝试过这个,但显然
Thread.Sleep(1000);
不是一个可行的方法。
var builder = WebApplication.CreateBuilder();
builder.Services.AddControllers();
var app = builder.Build();
app.Urls.Add(BaseAddress);
app.UseRouting();
app.MapControllers().AddApplicationPart(assemblyUnderTest);
Task.Run(() => app.Run());
Thread.Sleep(1000); // better solution needed.
var client = new HttpClient();
var response = client.GetAsync(BaseAddress + "/subpath/key").Result;
Console.WriteLine(response);
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
ApplicationStarted
的钩子,它通过 IHostApplicationLifetime
暴露出来。该钩子是一个 CancellationToken
,因此,您可以使用 Register
函数 在发出信号时执行自定义代码。不幸的是它不支持异步代码。
这是一个工作示例,说明如何在应用程序启动后向应用程序发出请求。
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
var builder = WebApplication.CreateBuilder();
var app = builder.Build();
app.MapGet("/test", () =>
{
return "Test";
});
Task.Run(() => app.Run());
IHostApplicationLifetime lifetime = app.Lifetime;
lifetime.ApplicationStarted.Register(() =>
{
var server = app.Services.GetService<IServer>();
var addressesFeature = server?.Features.Get<IServerAddressesFeature>();
var baseAddress = addressesFeature?.Addresses.FirstOrDefault();
var client = new HttpClient();
var response = client.GetAsync($"{baseAddress}/test").Result;
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
});
Console.ReadLine();