【问题标题】:How to warm up an ASP.NET MVC application on IIS 7.5?如何在 IIS 7.5 上预热 ASP.NET MVC 应用程序?
【发布时间】:2011-11-15 06:32:15
【问题描述】:

我们想要预热托管在 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 查询至少执行一次。

【问题讨论】:

标签: asp.net entity-framework asp.net-mvc-3 iis warm-up


【解决方案1】:

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

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

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

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

此 IIS 应用程序初始化模块内置于 IIS 8.0 中,但为 available for download for IIS 7.5

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您对此感兴趣。请查看原始查询中的“UPDATE 1”,它为问题提供了更多上下文。使用 ScottGu 博客中指定的方法可能无助于完成我们的所有要求。我们需要让网站上线——但在预热之前,所有人都无法访问。在允许所有人访问之前,我们需要浏览我们的页面。
    • @Dhwanil Shah,热身发生在 IIS 开始运行时,即在您的服务器重新启动之后并且在第一个请求有时间到达您的应用程序之前。
    • 我能否通过 IProcessHostPreloadClient 实现中的代码访问我网站中的页面?
    • @Dhwanil Shah,访问我网站中的页面是什么意思?如果要向它们发送 HTTP 请求,那么不,您将无法在 IProcessHostPreloadClient 实现中执行此操作,因为 IIS 在 warup 过程完成之前不允许任何 HTTP 请求。这就是热身的重点。
    • 我需要访问我网站中的页面以预热其中使用的 EF 查询。我需要使用 HTTP 请求登录、导航、搜索、添加编辑等。我们已经在 Global.asax 的应用程序启动事件中进行了基本的“正常”预热。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 您可以在部署之前(在构建过程中)预编译页面,这还有一个好处是可以发现在 C#/VB.NET 编译期间未检测到的错误。
    • @Michael - 感谢您对此感兴趣。请检查“UPDATE 1”以获取有关查询的更多上下文。
    • @Jakub - 我们正在使用 ASP.NET 预编译。
    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多