如何创建 ASP.NET Core 主机并在同一进程中对其运行请求

问题描述 投票:0回答:1

如何托管 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);
c# asp.net-core web-applications dotnet-httpclient self-hosting
1个回答
0
投票

正如我在评论部分指出的那样,有一个名为

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();
© www.soinside.com 2019 - 2024. All rights reserved.