asp.net 应用程序没有自动启动
asp.net application does not auto-start
我正在尝试为我的 asp.net IIS 8.5 中托管的 MVC 应用程序实现以下目标:
- 当服务器启动时,应用程序必须自动启动
- 应用程序不得因不活动而终止
- 应用程序必须在每天的指定时间重新启动一次
这是我当前在 IIS 中的配置:
- 应用程序池:
- 启动模式 = AlwaysRunning
- 空闲超时 = 0
- 禁用重叠回收 = True(也不适用于 "False")
- 回收/特定时间 = 03:00:00
- 网站:
- 已启用预加载 = True
我的问题是应用程序在指定的时间正常关闭(我通过在未来几分钟添加另一个条目来进行测试),但在那之后它没有重新启动,我在日志(Application_Start 没有 运行)并且第一次请求的开始时间很长(大约 15 秒,而后续请求大约 0.07 秒)。
是我做错了什么,还是 IIS 无法自动启动我的应用程序?
我不相信 applications/sites IIS 能够自行重启。这些年来我已经研究过好几次了,实现这一点的最可靠方法是通过计划任务来调用页面并保持站点活动。
这是一个 script.vbs
文件,您可以从计划任务调用:
Option Explicit
Dim url, xmlhttp
Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")
url = "http://example.com/page"
xmlhttp.open "GET", url, 0
xmlhttp.send ""
Set xmlhttp = Nothing
尝试各种设置后,事实证明 IIS 直到第一次请求才会加载您的应用程序 DLL,除非您给它 serviceAutoStartProvider
class,如 [=15] 中所述=]
您必须像这样配置 IIS:
- 应用程序池:
- 启动模式 = AlwaysRunning
- 空闲超时 = 0
- 禁用重叠回收 = True(如果您的应用程序允许多个并发实例则不需要)
- Recycling / Specific Times = 03:00:00(这只是一个例子,它会在每天的指定时间重启应用程序)
您还需要编辑文件C:\Windows\System32\inetsrv\config\applicationHost.config
(此处仅显示相关部分):
<configuration>
<system.applicationHost>
<sites>
<site name="your site name" serverAutoStart="true">
<application [...] serviceAutoStartEnabled="true" serviceAutoStartProvider="WarmUp">
</application>
</site>
</sites>
<serviceAutoStartProviders>
<add name="WarmUp" type="WarmUp, YourApplicationDLL" />
</serviceAutoStartProviders>
</system.applicationHost>
</configuration>
那么你必须在你的应用程序DLL中添加一个class:
public class WarmUp : System.Web.Hosting.IProcessHostPreloadClient
{
public void Preload(string[] parameters)
{
// This is the entry point, but your website is not serving
// pages yet here, so we can't send requests yet. Instead we
// start a new thread and return immediately. You could add
// initialization code that must run before serving any request.
new Thread(DoWarmUp).Start();
}
private static void DoWarmUp()
{
// Here we just send a request to the home page to preload it.
// This will run Application_Start, and compile .cshtml files
// if you use Razor ; you may want to add more pages to preload
using (var client = new WebClient())
{
client.DownloadData("http://localhost/MyHomePageIWantToPreload");
}
}
}
就是这样,现在您的 Web 应用程序实际上已准备好为主页提供服务,没有任何额外的延迟。如果您的应用程序中有特定的东西要预加载,您可以在 DoWarmUp
.
中添加更多初始化代码
绝对可以有应用Auto-Start。
no-one 似乎提到的部分是您必须安装“应用程序初始化”才能使其正常工作。
服务器管理器 --> 管理 --> 添加角色或功能 --> 下一步 --> 下一步 --> 下一步
展开 Web 服务器 (IIS) --> Web 服务器 --> 应用程序开发
并检查“应用程序初始化”
我正在尝试为我的 asp.net IIS 8.5 中托管的 MVC 应用程序实现以下目标:
- 当服务器启动时,应用程序必须自动启动
- 应用程序不得因不活动而终止
- 应用程序必须在每天的指定时间重新启动一次
这是我当前在 IIS 中的配置:
- 应用程序池:
- 启动模式 = AlwaysRunning
- 空闲超时 = 0
- 禁用重叠回收 = True(也不适用于 "False")
- 回收/特定时间 = 03:00:00
- 网站:
- 已启用预加载 = True
我的问题是应用程序在指定的时间正常关闭(我通过在未来几分钟添加另一个条目来进行测试),但在那之后它没有重新启动,我在日志(Application_Start 没有 运行)并且第一次请求的开始时间很长(大约 15 秒,而后续请求大约 0.07 秒)。
是我做错了什么,还是 IIS 无法自动启动我的应用程序?
我不相信 applications/sites IIS 能够自行重启。这些年来我已经研究过好几次了,实现这一点的最可靠方法是通过计划任务来调用页面并保持站点活动。
这是一个 script.vbs
文件,您可以从计划任务调用:
Option Explicit
Dim url, xmlhttp
Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")
url = "http://example.com/page"
xmlhttp.open "GET", url, 0
xmlhttp.send ""
Set xmlhttp = Nothing
尝试各种设置后,事实证明 IIS 直到第一次请求才会加载您的应用程序 DLL,除非您给它 serviceAutoStartProvider
class,如 [=15] 中所述=]
您必须像这样配置 IIS:
- 应用程序池:
- 启动模式 = AlwaysRunning
- 空闲超时 = 0
- 禁用重叠回收 = True(如果您的应用程序允许多个并发实例则不需要)
- Recycling / Specific Times = 03:00:00(这只是一个例子,它会在每天的指定时间重启应用程序)
您还需要编辑文件C:\Windows\System32\inetsrv\config\applicationHost.config
(此处仅显示相关部分):
<configuration>
<system.applicationHost>
<sites>
<site name="your site name" serverAutoStart="true">
<application [...] serviceAutoStartEnabled="true" serviceAutoStartProvider="WarmUp">
</application>
</site>
</sites>
<serviceAutoStartProviders>
<add name="WarmUp" type="WarmUp, YourApplicationDLL" />
</serviceAutoStartProviders>
</system.applicationHost>
</configuration>
那么你必须在你的应用程序DLL中添加一个class:
public class WarmUp : System.Web.Hosting.IProcessHostPreloadClient
{
public void Preload(string[] parameters)
{
// This is the entry point, but your website is not serving
// pages yet here, so we can't send requests yet. Instead we
// start a new thread and return immediately. You could add
// initialization code that must run before serving any request.
new Thread(DoWarmUp).Start();
}
private static void DoWarmUp()
{
// Here we just send a request to the home page to preload it.
// This will run Application_Start, and compile .cshtml files
// if you use Razor ; you may want to add more pages to preload
using (var client = new WebClient())
{
client.DownloadData("http://localhost/MyHomePageIWantToPreload");
}
}
}
就是这样,现在您的 Web 应用程序实际上已准备好为主页提供服务,没有任何额外的延迟。如果您的应用程序中有特定的东西要预加载,您可以在 DoWarmUp
.
绝对可以有应用Auto-Start。 no-one 似乎提到的部分是您必须安装“应用程序初始化”才能使其正常工作。
服务器管理器 --> 管理 --> 添加角色或功能 --> 下一步 --> 下一步 --> 下一步 展开 Web 服务器 (IIS) --> Web 服务器 --> 应用程序开发 并检查“应用程序初始化”