【问题标题】: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;
    }

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2017-12-16
    • 2020-08-11
    • 2019-10-10
    • 2018-11-20
    • 1970-01-01
    相关资源
    最近更新 更多