如何在不重启的情况下配置 IIS 7.5 + 每次 ASP.NET 重启时调用批处理文件

如何在不重启的情况下配置 IIS 7.5 + 每次 ASP.NET 重启时调用批处理文件

查询 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 下载

相关内容