【问题标题】:how to auto-start/warm up .net core web app hosted in IIS如何自动启动/预热 IIS 中托管的 .net 核心 Web 应用程序
【发布时间】:2020-10-21 17:22:51
【问题描述】:
我有一个托管在 IIS 上的 .net core (3.1) Web 应用程序。我无法弄清楚如何在第一个请求之前运行一段代码。我做了以下事情:
- 设置应用程序池的“启动模式”=“AlwaysRunning”和“空闲超时”=0
- 在网站上设置 'preload enabled' = true
我缺少的是在第一个请求到来之前我在哪里/如何注册我想运行的代码/服务?
提前致谢
【问题讨论】:
标签:
asp.net-core
.net-core
【解决方案1】:
我缺少的是在第一个请求到来之前我在哪里/如何注册我想运行的代码/服务?
如果您想在应用程序完全启动后调用您的 mvc 或 web api 之一来预热您的 web 应用程序。您可以尝试使用 IHostApplicationLifetime 的 ApplicationStarted 方法。
应用程序启动后立即调用该方法。
您可以将 IHostApplicationLifetime 注入到 Configure() 方法中,然后为 ApplicationStarted 编写回调,该回调将在应用程序主机完全启动时触发。
更多细节,你可以参考下面的例子:
在 Startup.cs 的 ConfigureServices 方法中注册 httpclient 服务
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient();
services.AddControllersWithViews();
}
在Configure方法中添加lifetime.ApplicationStarted.Register回调:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Default}/{action=Index}/{id?}");
});
IHttpClientFactory httpClientFactory = app.ApplicationServices.GetService(typeof(IHttpClientFactory)) as IHttpClientFactory;
lifetime.ApplicationStarted.Register(onApplicationStartedAsync(httpClientFactory).Wait);
}
private async Task<Action> onApplicationStartedAsync(IHttpClientFactory httpClientFactory)
{
var httpclient = httpClientFactory.CreateClient();
var httpMessage = new HttpRequestMessage(HttpMethod.Get, "http://localhost:5000/api/values");
var httpresponse = await httpclient.SendAsync(httpMessage);
if (httpresponse.IsSuccessStatusCode)
{
string res = await httpresponse.Content.ReadAsStringAsync();
}
return null;
}
结果: