查询 1 - 是否可以在不重新启动 IIS 的情况下更改 IIS 7.5 上的“IP 地址和域限制”?查询 2 - 每次重新启动 ASP.NET 工作进程时如何调用某个批处理文件(或可执行文件)?
我们有一个 ASP.NET MVC 网站,托管在 IIS 7.5 服务器上。我们需要通过浏览网站的许多页面和功能来预热网站。
这个想法是实现如下内容:
- 每次重新启动 ASP.NET 工作进程或 IIS 时,执行批处理文件(或可执行文件)。
- 在批处理文件中,配置 IIS 的“IP 地址和域限制”功能,以便仅处理来自 localhost 或 127.0.0.1 的请求。拒绝来自所有其他客户端的请求。
- 接下来,在批处理文件中,触发 HTTP 请求以执行登录、导航、搜索、添加编辑等功能来执行实际的预热。
- 预热结束后,配置 IIS 的“IP 地址和域限制”功能以处理来自所有客户端的请求。确保此更改不会触发 IIS 重置。
PS:请注意,以前在http://forums.iis.net/t/1176740.aspx已经被删除很长一段时间了。
附言:请参阅https://stackoverflow.com/questions/7387123/how-to-warm-up-an-asp-net-mvc-application-on-iis-7-5/7387528#7387528针对开发人员的重点查询。
更新 1:以下代码是根据 Scott 的回答使用 IIS 构建的。不幸的是,调用这些方法会重新启动 ASP.NET 工作进程。如何停止这种情况?顺便说一句,我不会发布 FindElement() 例程的代码,因为它本质上似乎是通用的。
internal static void AllowOnlyLocalUsers()
{
using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection ipSecuritySection = config.GetSection("system.webServer/security/ipSecurity", "MyApplication");
ipSecuritySection["allowUnlisted"] = false;
ConfigurationElementCollection ipSecurityCollection = ipSecuritySection.GetCollection();
ConfigurationElement addElement = ipSecurityCollection.CreateElement("add");
addElement["ipAddress"] = @"127.0.0.1";
addElement["allowed"] = true;
ipSecurityCollection.Add(addElement);
serverManager.CommitChanges();
}
}
internal static void AllowAllUsers()
{
using (ServerManager serverManager = new ServerManager())
{
Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection ipSecuritySection = config.GetSection("system.webServer/security/ipSecurity", "MyApplication");
ipSecuritySection["allowUnlisted"] = true;
ConfigurationElementCollection ipSecurityCollection = ipSecuritySection.GetCollection();
ConfigurationElement addElement = FindElement(ipSecurityCollection, "add", "ipAddress", @"127.0.0.1", "subnetMask", @"255.255.255.255", "domainName", @"");
if (addElement != null)
{
ipSecurityCollection.Remove(addElement);
}
serverManager.CommitChanges();
}
}
答案1
您可以在 applicationHost.config 中为站点的位置标记设置 IP 限制。如果这样做,则不会导致 appdomain 回收。全局级别的 URL 重写是另一种选择。
第 12 周和第 18 周我的视频系列涵盖 AppDomains 和编辑 apphost.config。
要编写脚本,请使用 appcmd。最好的方法是从 IIS 中的配置编辑器开始,进行所需的更改,然后从右侧的操作窗格中选择“生成脚本”。appcmd 命令将在那里。
至于第二个问题,您需要在项目中控制应用程序的启动并触发事件。异步调用将允许它启动您的启动脚本,同时允许页面继续,否则您将遇到锁定问题。
答案2
微软已经发布了一个模块,可以满足您的要求。IIS 7.5 的应用程序初始化模块通过在第一个请求到达之前加载 Web 应用程序来提高网站的响应能力。
当应用程序启动时,模块会将所有流量重定向到您提供的 html 页面。因此您根本不必费心处理 ip 限制。
您可以指定一系列 URL,IIS 将在接受来自真实用户的请求之前预加载这些 URL。我认为您无法获得真正的用户登录体验,但也许您可以设置不需要登录的模拟页面,以满足您要求的相同预热?
我认为最引人注目的功能是该模块还支持重叠进程回收。遵循 IIS 8.0 的教程包括如何实现重叠进程回收的逐步方法。
当 IIS 检测到活动工作进程正在被回收时,IIS 不会将活动流量切换到新回收的工作进程,直到新工作进程完成运行新进程中的所有应用程序初始化 URL。这可确保在应用程序上线并运行时,浏览您网站的客户不会看到应用程序初始化页面。
此 IIS 应用程序初始化模块内置于 IIS 8.0 中,但可供 IIS 7.5 下载。