网站首次访问时需要非常长的时间才能启动(总共最多68秒)

时间:2011-06-03 14:47:29

标签: asp.net iis

我有一个ASP.Net应用程序,第一次访问它时需要很长时间才能启动。我做了一些跟踪,发现这个函数花了57秒:

Boolean System.Web.Compilation.WebDirectoryBatchCompiler.CompileNonDependentBuildProviders(ICollection)

并且该函数依次调用以下函数6次:

Void System.Web.Compilation.WebDirectoryBatchCompiler.CompileAssemblyBuilder(AssemblyBuilder)

我的问题是System.Web.Compilation.WebDirectoryBatchCompiler.CompileAssemblyBuilder做了什么?我的Web应用程序已经编译好了,我不知道它为什么要在启动时进行任何类型的编译工作。这是正常的吗?是否有一些我不知道的事情?

3 个答案:

答案 0 :(得分:5)

启动ASP.NET应用程序时会发生很多引导。这包括引入的工作进程,加载到AppDomain中的程序集,以及当前目录中的文件编译。此批处理编译过程是每个文件夹,这意味着如果我第一次请求/,批处理编译器将扫描文件夹中的受支持类型,编译它们并缓存结果。这仅在根/文件夹中完成。我对另一个/OffRoot文件夹的第一个请求将导致另一个批量编译。

如果您有预编译的站点,运行时仍会执行此类扫描,但确定它不必编译任何内容。

预编译网站与已编译的Web应用程序之间存在重要差异。预编译的网站将提前完成此第一个实例的编译,因此只需将程序集加载到需要的AppDomain。使用已编译的Web应用程序,您已编译了基本源代码,但视图(.aspx)文件未编译,因此它仍然执行首次编译(动态编译)。

答案 1 :(得分:1)

AFAIK,ASP.NET基于.NET的服务世界。当然,这意味着编译实际上有两个部分。一种是将源代码编译为.NET字节码格式。其次是实际转换为适合在您的系统上实际运行的格式,通常采用即时方式。这与Java类似,但存在许多较低级别的差异。

问题在于它目前正在进行此JITting预先设计。可能需要一段时间才能启动和运行ASP.NET应用程序,这是您看到的那一刻。我相信有一种方法可以在有人实际访问该网站之前启用预先JIT,但我不确定具体的方式。希望有人会发布/链接到实际的方法。

答案 2 :(得分:0)

检查index.aspx或default.aspx以查看是否有任何Web应用程序。有时需要时间来查找文件,编译只需要第一次。