我有一个Web API服务,我将其部署到我的各种环境(使用Octopus Deploy)。它应该在启动时执行各种任务,例如运行Entity Framework Code First所需的任何迁移脚本,以及Hangfire管理的一些后台任务。麻烦的是,网站只有在第一次有人打电话时才会醒来。我希望它在我部署后立即运行。我可以通过将Web浏览器指向API的主页来手动完成,但这需要我记住这样做,如果我要部署到多个触角,那么这是一个主要的PITA
如何强制网站在部署后立即自动启动?
答案 0 :(得分:8)
在控制面板下打开或关闭窗口功能, 在" Web服务器(IIS)下Web服务器|应用程序开发", 选择"应用程序初始化"。
在IIS中,在应用程序池的高级设置上, "启动模式"应该设置为" AlwaysRunning"。
在IIS中,在网站的高级设置上, "预加载"应该设置为" true"。
新部署将导致它再次启动(可能在短暂延迟后)。
答案 1 :(得分:7)
你可以使用应用程序初始化模块,正如许多答案所提到的那样,但是将PowerShell步骤放入部署中有几个好处......
我使用此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)
Use a powershell script to make a call to localhost or the specific machine being deployed to post deploy突出显示子菜单。另一种选择是使用Application Initialization Module。
答案 3 :(得分:0)
您需要执行以下步骤 -
启用Windows进程激活(WAS)和万维网发布(W3SVC)服务的自动启动(默认情况下启用)。
为应用程序池配置自动启动(默认情况下启用)。
启用应用程序池的始终运行模式并配置自动启动功能
对于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