18

我们想要预热托管在 IIS 7.5 服务器上的 ASP.NET MVC 应用程序。过去在http://forums.iis.net/t/1176740.aspx上提供的热身模块已被删除。

每次 IIS 或 ASP.NET 工作进程因任何原因重新启动时,都应预热应用程序。在预热期间,IIS 应返回一些 HTTP 状态代码,表示其预热状态或无法为任何客户端提供服务。

创建一个通过 HttpRequests 浏览站点中必要页面的可执行文件是个好主意吗?可执行文件可以从 IProcessHostPreloadClient 实现触发。是否可以将 IIS 配置为仅接受来自 localhost 的请求,并且一旦可执行文件完成,它就可以切换到所有客户端 - 但该切换不应触发 IIS 重新启动(显然)。

是否可以使用 Visual Studio 2010 - Web 性能测试来预热应用程序而不是创建手动可执行文件?还有其他选择吗?

PS:应用程序使用表单身份验证并使用会话 - 因此维护状态 cookie 和其他 cookie 很重要。

更新 1 - 我们在我们的应用程序中使用 .NET Framework 4.0 和 Entity Framework(数据库优先)。EF 查询的第一次命中很慢。热身背后的原因是为了让这些第一次击球不碍事。我们已经在大多数地方使用编译查询,并且我们已经为 EF 实现了预编译视图。模型和应用程序的大小非常庞大和复杂。预热需要遍历许多页面,以确保在任何最终用户访问应用程序之前,已编译和未编译的 EF 查询至少执行一次。

4

3 回答 3

12

Microsoft 发布了一个完全符合您要求的模块。IIS 7.5的应用程序初始化模块通过在第一个请求到达之前加载 Web 应用程序来提高网站的响应能力。

您可以指定 IIS 在接受来自真实用户的请求之前预加载的一系列 Url。我认为您无法获得真正的用户登录体验,但也许您可以设置不需要登录的模拟页面来满足您要求的相同预热?

我认为最引人注目的功能是该模块还支持重叠进程回收。以下来自 IIS 8.0 的教程包含有关如何启用重叠进程回收的分步方法。

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

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

于 2012-09-20T20:52:53.977 回答
10

您可以查看以下帖子,了解 IIS 7.5 和 ASP.NET 4.0 中内置的自动启动功能。

于 2011-09-12T12:04:18.850 回答
6

任何为托管资源生成服务器请求的应用程序都可用于预热 IIS 进程。您需要多少请求取决于需要预热的部分。通常,热身用于:

  • 启动工作进程。为此,您只需要请求一个资源来为整个应用程序预热一个进程。
  • 执行任何静态初始化、数据库启动或预缓存。您在 Global.asax 文件中所做的任何事情都会在您进行第一次请求时发生,因此如果您可以在那时进行所有初始化,您仍然只需要发出一个页面请求。
  • 强制预编译 ASP.NET 页面。为此,您需要点击每一页。幸运的是,这通常不会花费太多时间,因此您可能无需担心。如果您确实有个别页面加载缓慢,您可以单独预热它们。

这里的“热身”过程并不神奇。您只需要强制 IIS 提供有问题的 URL。你提到的一切都会解决这个问题:使用压力测试工具来查询 URL,编写自定义实用程序来发布 HTTP 请求,甚至只是编写像“wget”这样的工具或 PowerShell 脚本来下载 URL 都可以做到.

至于限制对本地主机的访问,据我所知,在 IIS 中,唯一的更改方法是重新启动 IIS。您总是可以在您的应用程序中构建一个预请求挂钩并在那里维护状态,并让您的热身过程查询一些将状态切换为“打开”的特定 URL。但我不确定你会完成什么。如果不知何故,用户确实在您的热身完成之前尝试查询您的网站,那么您的网站将需要很长时间才能响应,然后他们最终会得到他们要求的页面。如果您在热身期间将他们锁定在网站之外,他们会收到一个浏览器网络错误,声称该网站已离线,这(对我来说)听起来更糟。

于 2011-09-12T12:04:53.707 回答