如何承载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);

推荐答案

正如我在 comments 部分指出的,有一个叫做ApplicationStarted的钩子,它通过IHostApplicationLifetimeexpose 出来.这个钩子是一个CancellationToken,所以,你可以使用Register function来执行一个自定义代码,当它发出信号时.不幸的是,它不支持异步代码.

下面是一个工作示例,如何在应用程序启动后向其发出请求:

using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;

var builder = WebApplication.CreateBuilder();
var app = builder.Build();
app.MapGet("/test", () => "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); //Test
});

Console.ReadLine();

这是一个工作dotnet fiddle.请注意This is only required in dotnet fiddle comments

Csharp相关问答推荐

如何使嵌套for-loop更高效?

在Dapper中使用IasyncEum重写GetAsyncEum方法

需要澄清C#的Clean Architecture解决方案模板的AuditableEntityInterceptor类

实体核心框架--HasColumnType和HasPrecision有什么不同?

C#.NET依赖项注入顺序澄清

为什么SignalR在每个Blazor服务器应用程序启动时最多启动8个服务器?

如何忽略API JSON响应中的空字符串?

在调整大小的控件上绘制

我想在文本框悬停时在其底部显示一条线

如何在C#中实现非抛出`MinBy`?

NET8 Maui&;iOS:AppCenter崩溃错误

使用CollectionView时在.NET Maui中显示数据时出现问题

.NET8->;并发词典总是比普通词典快...怎么回事?[包含基准结果和代码]

C#静态抽象属性不能被子接口覆盖

Foreach非常慢的C#

Visual Studio如何使用当前的框架?

仅在ASP.NETCore应用程序中的附加单独端口上公开一组终结点

在C#中删除多个不同名称的会话

根据运行时值获取泛型类型的字典

使用';UnityEngineering.Random.Range()';的IF语句仅适用于极高的最大值