asp.net - IIS Web-Garden 强制进程初始化可能吗?

标签 asp.net iis caching web-garden

我们有一个在 IIS Web 花园中运行的 ASP.Net Web 应用程序,该应用程序配置为分配最多四个进程。在我们的 Web 应用程序中,第一个访问该站点的用户会导致加载所有缓存的项目。由于我们在 IIS Web-Garden 中运行,因此最终需要最多四个首次用户为四个 Web-Garden 进程中的每一个进程建立缓存。这个缓存构建需要 30-40 秒,我们试图让它更快,但不太可能再改进了。

这是 Not Acceptable ,我们的任务是始终让每个人都能快速访问网站(无需等待缓存初始化)。我想采用一种抓取网站来预热缓存的解决方案。问题在于 Web-Garden 功能似乎是一个黑匣子——您无法控制 IIS 是否/何时决定在遇到下一个 HTTP 请求时加载第二个、第三个或第四个进程。

对我来说,这似乎是一个常见问题,但寻找解决方案却收效甚微。我的问题是,有没有办法通过 HTTP header 或其他一些构造来给 IIS 一个提示,表明您希望它加载或至少路由到进程 2、3、4 等?

最佳答案

根据 Microsoft 工程师的说法,这在 IIS 6 中是不可能的。但是他们在 IIS 7.5 和 ASP.Net 4.0 中添加了一项新功能,该功能很好地满足了我在这里所寻找的功能。它称为“preloadProvider”。下面是一个示例片段(非常酷!)。

http://forums.iis.net/p/1158476/1907392.aspx

由于单个应用程序池可以包含多个应用程序,因此您可以通过在 applicationHost.config 文件中使用以下配置来指定要自动启动的各个应用程序:

<sites>

  <site name="MySite" id="1">

    <application path="/"

         preloadEnabled="true"

         preloadProvider="PrewarmMyCache" >

        <!--  Additional content -->

    </application>

  </site>

</sites>



<!-- Additional content -->



<preloadProviders>

     <add name="PrewarmMyCache"

         type="MyNamespace.CustomInitialization, MyLibrary" />

</preloadProviders>

当 IIS 7.5 服务器冷启动或回收单个应用程序池时,IIS 7.5 使用 applicationHost.config 文件中的信息来确定需要自动启动哪些 Web 应用程序。对于每个标记为自动启动的应用程序,IIS7.5 都会向 ASP.NET 4.0 发送请求,以在应用程序暂时不接受 HTTP 请求的状态下启动该应用程序。当处于这种状态时,ASP.NET 实例化由 preloadProvider 属性定义的类型(如前面的示例所示)并调用其公共(public)入口点。 您可以通过实现 IProcessHostPreloadClient 接口(interface)来创建具有必要入口点的托管自动启动类型,如以下示例所示:

public class CustomInitialization :  System.Web.Hosting.IProcessHostPreloadClient

{

    public void Preload(string[]  parameters)

    {

        // Perform initialization.

    }

}

在 Preload 方法中运行初始化代码并且该方法返回后,ASP.NET 应用程序就准备好处理请求。 通过在 IIS 7.5 和 ASP.NET 4.0 中添加自动启动功能,您现在拥有一种定义明确的方法,可以在处理第一个 HTTP 请求之前执行昂贵的应用程序初始化。例如,您可以使用新的自动启动功能来初始化应用程序,然后向负载均衡器发出信号,表明该应用程序已初始化并准备好接受 HTTP 流量。

关于asp.net - IIS Web-Garden 强制进程初始化可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/998672/

相关文章:

c# - 在 C# MVC 中检测主要搜索引擎的最佳方法

javascript - 我的启动项目中的 JS 文件又出现 'The Breakpoint will not currently be hit' 错误

iis - 在 TFS 2015 中将多个 HTTPS 站点部署到单个主机时遇到问题

IIS 上的 PHP 7 : Call_user_function could not be located

internet-explorer - 从带有查询字符串的 URL 缓存

c# - MonthGenitiveNames 和 MonthNames 之间有什么区别?为什么月份有空白?

asp.net-core - 如何更新正在运行的 asp.net core 应用程序?

caching - 不同级别的缓存是否在同一频域中运行?

python - Django:如何缓存一个函数

c# - 错误处理的设计模式