2011-06-03 91 views
4

我有一个ASP.Net应用程序,第一次访问时需要很长的时间才能启动。我做了一些跟踪,我发现有57秒在这个函数中度过:网站第一次访问时需要非常长的时间(最多68秒)

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

,进而该函数调用以下一个6次:

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

我的问题是什么System.Web.Compilation.WebDirectoryBatchCompiler.CompileAssemblyBuilder做什么?我的web应用程序已经编译完成,我不知道为什么它会在启动时进行任何编译工作。这是正常的吗?有什么事情我不知道?

+0

您是否在部署之前预编译了您的Web应用程序?请参阅链接http://msdn.microsoft.com/en-us/library/bb398860.aspx – 2011-06-03 15:03:05

+0

@ 1stein我使用的是“web应用程序”项目,而不是“网站”项目,因此它应该已经将所有内容编译为BIN子目录。 – 7wp 2011-06-03 15:20:55

回答

5

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

如果你有一个预编译的站点,运行时仍然执行这种类型的扫描,但确定它不需要编译任何东西。

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

+0

谢谢我打算使用Web部署项目将包含.aspx文件的所有内容编译为一个程序集(http://weblogs.asp.net/scottgu/archive/2008/01/28/vs-2008-web-deployment- project-support-released.aspx) – 7wp 2011-06-03 16:28:40

1

AFAIK,ASP.NET基于.NET处理世界。当然,这意味着实际上有两部分编译。一种是你将源码编译成.NET字节码格式。其次是实际转换成适合您的系统实际运行的格式,通常采用即时(Just-In-Time)的方式。这与Java类似,尽管存在很多较低层次的差异。

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

0

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

+0

没有任何意义。那么为什么框架会在函数CompileNonDependentBuildProviders中花费57秒?还请注意,“网站”项目和“网络应用程序”项目存在差异。我认为马修阿博特说明了为什么会发生这种情况。尽管Web应用程序的代码已经编译完成,但.aspx部分却没有,而这正是服务器第一次启动时的命中。 – 7wp 2011-06-03 18:50:04