我有一个用C#编写的WebAPI,托管在Windows Server Datacenter 2019上.API应该始终处于运行和准备状态,并且不应该被释放!

如果我停止ApplicationPool并重新启动它,API不会初始化,直到我发送请求或打开API的URL,然后它才会继续工作.

问题是,我有一个ScopedService,它应该在后台执行一些工作,通过重新启动AppPool或IIS,它会停止作业(job),直到请求到来.

我try 了很多 idea ,但都不起作用.

我将AppPool设置为Always Running,并将空闲超时设置为0,但也没有帮助!

我还try 编写一个GetMethod来唤醒API,并在web.config中添加了=>

<applicationInitialization doAppInitAfterRestart="true" skipManagedModules="true">
        <add initializationPage="api/app_start" />
      </applicationInitialization>`

但也没有奏效!

应用程序已完全释放,并且它仅通过调用方法或URL来唤醒.

唯一有效的方法是在使用Windows TaskPlaner重启IIS后通过shell 脚本自动直接调用API,但这只是一个变通方法,我不喜欢它.

有没有人知道怎么干净利落?并在IIS重新启动或AppPool重新启动时自动初始化/唤醒应用程序?

推荐答案

我们向托管我们的ASP.NET Core 6应用程序的用户提供的安装文档确定了在应用程序池启动或重置时立即启动应用程序所需的所有先决条件和步骤.我在这里转述它们:

VM Prerequisites

已安装的角色和服务(来自服务器管理器):

  • 互联网信息服务-万维网服务
    • 应用程序开发功能
      • ASP.NET 4.8
      • 应用程序初始化

IIS Configuration

Application Pools

  • 启动模式:始终运行
  • 空闲超时(分钟):0
  • 最大工作进程数:1
  • 建议回收;具体时间:每天04:00(凌晨4:00)

这可以作为%systemroot%\system32\inetsrv\appcmd.exe的命令行参数来完成:

set apppool "AppPoolName" /autostart:true /startMode:"AlwaysRunning" /processModel.idleTimeout:"00:00:00" 
set apppool "AppPoolName" /-recycling.periodicRestart.schedule
set apppool "AppPoolName" /+recycling.periodicRestart.schedule.[value='04:00:00']

Applications

添加站点时,请确保选中了"立即启动网站":

enter image description here

或从命令行执行以下操作:

set site "ApplicationName" /applicationDefaults.preloadEnabled:true

不需要在web.config中或其他地方执行其他步骤.

Csharp相关问答推荐

如何将字节数组转换为字符串并返回?

WPF Windows初始化正在锁定. Net 8中分离的线程

Unity 2D自顶向下弓旋转

C#阻塞调用或await calling inside calling方法

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

正在try 从Blazor中的API读取JSON

如何防止Visual Studio断点以红色突出显示到整行?

在Windows Plesk上发布ASP.NET Core 7 Web API-错误:无法加载文件或程序集';Microsoft.Data.SqlClient';

实体框架-IsRequired()与OnDelete()

基于C#方法的EF核心过滤查询(缓冲与流)

将J数组转换为列表,只保留一个嵌套的JToken

如何使用类似于[SELECT*FROM&Q;&Q;WHERE&Q;]SQL查询的System.Data.Entity创建查询?

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

毛伊岛.NET 8图片不再适合按钮

如何在使用Google.Drive.apis.V3下载文件/文件夹之前压缩?

如何在ASP.NET Core 8中获取键控服务词典

如何在.NET MAUI上在iOS和Mac之间共享代码?(no条件编译和无代码重复)

C#定时器回调对象上下文?

在C#中通过Matheval使用自定义公式

如何对列表<;列表>;使用集合表达式?