如何在不重新启动的情况下configurationIIS 7.5并在每次重新启动ASP.NET时调用batch file

查询1 – 是否有可能更改IIS 7.5上的“IP地址和域限制”,而无需重新启动IIS? 查询2 – 如何在每次ASP.NET辅助进程重新启动时调用一些batch file(或可执行文件)?

我们有一个ASP.NET MVC站点,我们在IIS 7.5服务器上托pipe。 我们需要通过浏览网站的许多页面和function来预热网站。

这个想法是实现如下所示:

  • 在每次重新启动ASP.NET工作进程或IIS时,执行batch file(或可执行文件)。
  • 在batch file中,将IIS的“IP地址和域限制”functionconfiguration为仅从本地主机或127.0.0.1提供请求。 拒绝所有其他客户的请求。
  • 接下来,在该batch file中,激发HTTP请求以执行login,导航,search,添加编辑等function以执行实际的预热。
  • 一旦预热完成,configurationIIS的“IP地址和域限制”function来处理来自所有客户端的请求。 确保此更改不会触发IIS重置。

PS:请注意,以前在http://forums.iis.net/t/1176740.aspx上可用的IIS预热模块已经被删除了很长一段时间。

PS:请参阅https://stackoverflow.com/questions/7387123/how-to-warm-up-an-asp-net-mvc-application-on-iis-7-5/7387528#7387528开发人员集中查询。

更新1:下面的代码是根据Scott的答案使用IIS构build的。 不幸的是,调用这些方法重新启动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(); } } 

您可以在applicationHost.config中的站点位置标记中设置IP限制。 如果你这样做,那么它不会导致一个appdomain回收。 在全球层面的URL重写是另一种select。

我的video系列的第12周和第18周包括AppDomains和编辑apphost.config。

要编写脚本,请使用appcmd。 最好的方法是从IIS中的configuration编辑器开始,进行所需的更改,然后从右侧的操作窗格中“生成脚本”。 appcmd命令将在那里。

至于第二个问题,您需要在您的项目中获得应用程序启动的句柄,并触发一个事件。 asynchronous调用将允许它启动您的启动脚本,同时允许页面继续,否则会遇到locking问题。

微软已经发布了一个完全符合你要求的模块。 IIS 7.5的应用程序初始化模块通过在第一个请求到达之前加载Web应用程序来提高Web站点的响应速度。

在应用程序启动时,模块会将所有stream量redirect到您提供的html页面。 所以,你根本不必拨动ip限制。

您可以指定一系列的Url,IIS将在接受来自真实用户的请求之前预加载。 我不认为你可以得到一个真正的用户loginexpereince,但也许你可以设置模拟的网页,不需要login,履行相同的热身,你所要求的?

我认为最引人注目的特点是,这个模块还可以实现重复的stream程回收。 以下来自IIS 8.0的教程包含了一个关于如何启用重叠stream程回收的分步方法。

当IIS检测到正在回收活动工作进程时,IIS不会将活动stream量切换到新的回收工作进程,直到新工作进程在新进程中完成运行所有应用程序初始化URL为止。 这确保浏览您的网站的客户在应用程序正式运行时不会看到应用程序初始化页面。

此IIS应用程序初始化模块内置于IIS 8.0中,但可供IIS 7.5下载 。