正如此处各种其他相关问题中所述,我还期望在(重新)部署具有相当大的 EF6 模型和大量引用的 nuget 包的 Web 角色后,第一次调用会持续很长时间(30 秒)。在尝试了不同的建议解决方案之后preloadEnabled
,serviceAutoStartProviders
我仍然感到困惑并决定重新打开这个话题,希望有人在此期间找到更好的解决方案。
我的主要目标是让 Web 角色在新部署中退出其忙碌状态并可由负载均衡器和外部客户端访问时,几乎与后续调用一样快地响应第一个请求。不幸的是,到目前为止,我在提出的解决方案中遇到了以下问题:
preloadEnabled
:- 我确实
PKGMGR.EXE /iu:IIS-ApplicationInit
在启动任务中添加了应用程序初始化模块。到目前为止,一切都很好。 - 然后,当我尝试执行
%windir%\system32\inetsrv\appcmd set site "MySiteName" -applicationDefaults.preloadEnabled:true
它时,它会失败,因为在执行启动脚本时仍然没有在 IIS 中创建新部署的网站。 - 如果我尝试
ServerManager
在我的方法中通过 -class设置 preloadEnabled 设置Application_Start
,我无法理解,在对 web 角色进行第一次外部调用之前,如何执行此代码,因为 preloadEnabled 设置默认为 false 之后一个新的网络角色部署,因此我理解的 Application_Start 方法没有机会被应用程序初始化模块执行?
- 我确实
serviceAutostartProviders
:- 在这里,我们需要
IProcessHostPreloadClient
在 applicationhost.config 中放置实现接口的 AutostartProvider 的名称,即使用 appcmd 脚本或 ServerManager 类,但是:- serviceAutostartProvider 就像 preloadEnabled 一个与站点相关的设置,所以我们在这里遇到与
%windir%\system32\inetsrv\appcmd set site "MySiteName" -applicationDefaults.preloadEnabled:true
1.2 中相同的问题 - 在全新部署后的启动脚本执行时,网站尚未在 IIS 中创建并且脚本无法正确执行 - 另一种可能性是将 applicationhost.config 包含到部署包中,但我没有找到任何解决方案来为 Web 角色执行此操作。
- serviceAutostartProvider 就像 preloadEnabled 一个与站点相关的设置,所以我们在这里遇到与
- 在这里,我们需要
那么你们是如何设法确保在角色第一次从外部受到攻击之前运行预加载程序集和一些初始化代码(如填充内存缓存)?
我们现在开始获得一些流量并获得大约。我们的 WebApi 上每秒有 1-2 个请求,因此在每次更新部署后预加载对客户端“可见”的 30 秒延迟现在已成为一个主要问题。
我们在低流量时间安排更新部署,但如果我需要进行紧急修补程序部署怎么办?