pre-jit-compiling MVC Web应用程序

时间:2014-04-18 12:11:45

标签: asp.net-mvc asp-classic compilation jit ngen

在更新后使用我们的MVC Web应用程序时,首次加载主页需要几分钟时间。第一次加载后,加载速度非常快。可能MSIL代码被编译为Native Machine代码并被缓存。 (如我错了请纠正我)。每个页面都会出现这种情况。

每次将新版本复制到服务器时都会非常慢。 为了解决这个问题,我试图用ngen进行pre-jit编译,这样我们就可以为用户节省大量时间。 但是当对它的项目bin文件夹中的每个dll执行“ngen install mydll.dll”时,它会给我带来一些错误。这是命令

cd "C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
for %%i in (C:\inetpub\wwwroot\myproject\bin\*.dll) do ngen install "%%i"

第一个错误是:

Failed to load dependency System.Web.Mvc of assembly DotNetOpenAuth.Core, 
Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246 because of the following error : The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Failed to load dependency log4net of assembly DotNetOpenAuth.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246 because of the following error : The system cannot find the file specified. (Exception from  HRESULT: 0x80070002)

该项目只是调试和构建良好。实现这一目标的正确方法是什么?

1 个答案:

答案 0 :(得分:7)

您必须预热Web应用程序的初始化。这将首次加快主页的负荷。为您提供简要的概念性概述:

1)在向网站发出第一个请求之前,不会生成工作进程。工作进程与应用程序池关联。当进程启动网站时,工作进程的产生可以是时间进程。所以第一步是提前生成工作进程(w3wp.exe)。这可以在应用程序池级别完成

2)第一次请求到网站;工作进程加载所有应用程序DLL以执行请求。这个加载dll的过程可能需要时间。此外,当回收App Pool时,工作进程必须再次重新加载所有应用程序dll。所以第二步是通过工作进程预加载dll。这可以在网站级别完成。

应用程序预热模块是IIS 8.0中的内置功能。<​​/ p>

请按照以下链接在IIS中预热您的Web应用程序:

http://technet.microsoft.com/en-us/video/microsoft-virtual-academy-ii8-application-initialization.aspx

http://blogs.msdn.com/b/amol/archive/2013/01/25/application-initialization-ui-for-iis-7-5.aspx

http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization

http://weblog.west-wind.com/posts/2013/Oct/02/Use-IIS-Application-Initialization-for-keeping-ASPNET-Apps-alive