【问题标题】:Is Kestrel started immediately by IIS AspNetCore module?Kestrel 是否由 IIS AspNetCore 模块立即启动?
【发布时间】:2019-02-27 13:24:10
【问题描述】:

我们面临一个问题,在本地,当使用 IIS Express 时,Startup 类的方法在应用程序启动后立即被调用,即使没有启动浏览器。 (这是一个 Db 迁移)

但是,当应用程序部署到 IIS 时,Startup 类仅在首次请求站点后运行。

是 IIS/AspNetCore 模块的错吗?如果是的话,除了在部署后进行查询之外,是否可以强制启动 Kestrel?

【问题讨论】:

  • 你是在进程内还是进程外运行它?
  • 我想它默认是进程内的?非托管代码的应用程序池。
  • 不,默认情况下它不在进程中。
  • 那么它就出过程了。 =)
  • in proc 和 out of proc 的区别在于 IIS 是否充当 Kestrel 的反向代理。在 out of proc(之前的默认设置)的情况下,Kestrel 运行应用程序和 IIS 代理请求。使用 in proc(新的默认设置),IIS 直接托管应用程序,不再涉及 Kestrel。在任何一种情况下,您仍然有一个在 IIS 中运行的应用程序池。默认情况下,应用程序池将设置为“按需”,这意味着它将在一段时间不活动后自行关闭,然后在有请求满足时再次启动。您想将其更改为“始终运行”。

标签: iis asp.net-core entity-framework-migrations kestrel-http-server


【解决方案1】:

好的,魔法由多个parts组成:

首先,我们应该有一个正在运行的应用程序池。这是通过将池的启动模式设置为AlwaysRunning(默认为OnDemand)来配置的。也可以查看question

第二,我们必须将站点的设置Preload Enabled设置为true。 (站点 -> 高级设置)。

第三,我们在web.config文件中指定applicationInitialization部分。

article 告诉我们如何使用 PowerShell 执行这些操作。


注意:我需要应用程序预热,因为我在应用程序启动时运行数据库迁移。当我们部署到多个实例时,我们使用滚动部署来避免并发迁移。

流程大致如下:

  • 停止所有实例
  • 在等待期间按顺序将新版本部署到每个实例

它引入了较短的服务停机时间,尽管这对我们来说现在很好。

【讨论】:

    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2011-05-06
    • 2016-09-19
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多