如何让IIS站点在部署后自动启动?

时间:2015-11-29 14:08:20

标签: iis-7.5 octopus-deploy hangfire

我有一个Web API服务,我将其部署到我的各种环境(使用Octopus Deploy)。它应该在启动时执行各种任务,例如运行Entity Framework Code First所需的任何迁移脚本,以及Hangfire管理的一些后台任务。麻烦的是,网站只有在第一次有人打电话时才会醒来。我希望它在我部署后立即运行。我可以通过将Web浏览器指向API的主页来手动完成,但这需要我记住这样做,如果我要部署到多个触角,那么这是一个主要的PITA

如何强制网站在部署后立即自动启动?

4 个答案:

答案 0 :(得分:8)

在控制面板下打开或关闭窗口功能, 在" Web服务器(IIS)下Web服务器|应用程序开发", 选择"应用程序初始化"。

在IIS中,在应用程序池的高级设置上, "启动模式"应该设置为" AlwaysRunning"。

在IIS中,在网站的高级设置上, "预加载"应该设置为" true"。

新部署将导致它再次启动(可能在短暂延迟后)。

答案 1 :(得分:7)

可以使用应用程序初始化模块,正如许多答案所提到的那样,但是将PowerShell步骤放入部署中有几个好处......

  1. 它可以使您的网站热身
  2. 它可以像一个非常基本的烟雾测试
  3. 如果失败,部署在Octopus中标记为失败
  4. 我使用此PowerShell script to warm up and check websites after deployment

    Write-Output "Starting"
    
    If (![string]::IsNullOrWhiteSpace($TestUrl)) {
        Write-Output "Making request to $TestUrl"
    
        $stopwatch = [Diagnostics.Stopwatch]::StartNew()
        $response = Invoke-WebRequest -UseBasicParsing $TestUrl -MaximumRedirection 0
        $stopwatch.Stop()
    
        $statusCode = [int]$response.StatusCode
    
        If ($statusCode -ge 200 -And $statusCode -lt 400) { 
            Write-Output "$statusCode Warmed Up Site $TestUrl in $($stopwatch.ElapsedMilliseconds)s ms"
    
            $stopwatch = [Diagnostics.Stopwatch]::StartNew()
            $response = Invoke-WebRequest -UseBasicParsing $TestUrl -MaximumRedirection 0
            $stopwatch.Stop()
    
            $statusCode = [int]$response.StatusCode
            Write-Output "$statusCode Second request took $($stopwatch.ElapsedMilliseconds)s ms"
        } Else {
            throw "Warm up failed for " + $TestUrl
        }
    } Else {
        Write-Output "No TestUrl configured for this machine."
    }
    
    Write-Output "Done"
    

答案 2 :(得分:1)

答案 3 :(得分:0)

您需要执行以下步骤 -

  1. 启用Windows进程激活(WAS)和万维网发布(W3SVC)服务的自动启动(默认情况下启用)。

  2. 为应用程序池配置自动启动(默认情况下启用)。

  3. 启用应用程序池的始终运行模式并配置自动启动功能

  4. 对于step3,您需要一个实现IProcessHostPreloadClient接口的特殊类。它将在启动期间和每个应用程序池回收后由Windows进程激活服务自动调用。

    public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient
    {
        public void Preload(string[] parameters)
        {
            //Write code here to kick off the things at startup.
        }
    }
    

    Hangfire上详细记录了完整的流程。 http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html