【问题标题】:Prevent Asp Net Core 3 application from being stopped/unloaded/disposed防止 Asp Net Core 3 应用程序被停止/卸载/处置
【发布时间】:2020-04-08 06:53:48
【问题描述】:

我使用 .net core 3 开发了我的 Web 应用程序。我将它部署在运行 IIS 的主机上。我的应用程序中最重要的模块之一是应在所有应用程序生命周期内执行的计划任务。我面临的问题是应用程序在 1 或 2 小时不活动后停止。

我使用“进程外”方法部署应用程序。为了达到这个目标,我在Program.cs 使用此代码初始化应用程序:

Host.CreateDefaultBuilder(args)               
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseIISIntegration();
                    webBuilder.UseEnvironment(EnvironmentName);
                    webBuilder.UseStartup<Startup>();
                });   

另外,我把这些设置放到 .scproj

 <PropertyGroup>
    <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
  </PropertyGroup>

然后我检查我的标题,我可以在我的响应标题中看到这个条目:

Server: Kestrel

我的计划是在IHostedService 实现的,应该作为后台任务运行。

以上所有内容都让我认为应用程序应该不间断运行并且不应该由 IIS 处理,因为它在 Kestrel 上运行并且仅将 IIS 用作代理服务器。但实际上,情况有所不同。使用日志,我可以看到一两个小时后我的应用程序如何停止运行并且不再记录。

另外,我无权访问 IIS,因为它超出了我的权限,所以我无法更改它的设置。有人知道如何让我的应用程序不间断地运行吗?

【问题讨论】:

  • 过去我确实对我的网络应用程序停止后台任务感到沮丧。您可以研究的一件事是使用Runly for your background tasks 之类的东西。它允许您在与您的 Web 应用程序相同的机器上托管您的后台作业,但它不会因 IIS 的奇思妙想而停止。全面披露:我与人共同创立了 Runly,希望它能帮助像你这样的人。

标签: c# asp.net asp.net-core iis


【解决方案1】:

您需要设置这些 IIS 设置,以防止您的应用程序由于不活动而被自动回收。

应用程序池设置:

  1. 将启动模式更改为 AlwaysRunning - 这会使服务立即启动,而不是等待请求
  2. 将空闲超时更改为 0 - 这将允许服务继续运行,即使没有请求进入它。否则,服务将在配置的分钟数后关闭,因为它没有收到新的请求。
  3. 将常规时间间隔更改为 0 - 这将防止服务在该间隔定期重启

网站设置: 在网站的高级设置中,将 Preload Enabled 更改为 true。

【讨论】:

    【解决方案2】:

    更好的方法是更改​​iis 设置。

    运行此powershell 脚本以使iis 中的应用程序保持活动状态。如果您的服务器已重新启动,则通过此脚本您的应用程序将自动运行

    • $AppPool 是您在 Application Pools 中的应用程序的名称
    • $Site 是您在 Sites 中的应用程序的名称
    ## IIS WebAdmin Module
    Import-Module WebAdministration
    
    $AppPoolInstance = Get-Item IIS:\AppPools\$AppPool
    
    Write-Output "Set Site PreLoadEnabled to true"
    Set-ItemProperty IIS:\Sites\$Site -name applicationDefaults.preloadEnabled -value True
    
    Write-Output "Set Recycling.periodicRestart.time  = 0"
    $AppPoolInstance.Recycling.periodicRestart.time = [TimeSpan]::Parse("0");
    $AppPoolInstance | Set-Item
    
    Write-Output "Set App Pool start up mode to AlwaysRunning"
    $AppPoolInstance.startMode = "alwaysrunning"
    
    Write-Output "Disable App Pool Idle Timeout"
    $AppPoolInstance.processModel.idleTimeout = [TimeSpan]::FromMinutes(0)
    $AppPoolInstance | Set-Item
    
    if ($appPoolStatus -ne "Started") {
        Write-Output "Starting App Pool"
        Start-WebAppPool $AppPool
    } else {
        Write-Output "Restarting App Pool"
        Restart-WebAppPool $AppPool
    }
    

    这个link 可能对你有帮助

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 2017-02-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 2015-05-01
      • 2012-12-12
      • 1970-01-01
      • 2019-07-29
      相关资源
      最近更新 更多