4

我有一个 ASP.NET 2.0 应用程序(从 MSI 安装在 IIS 6.0 上),它被编译为“网站”,并在 Visual Studio 2005 中使用 Web 部署项目进行预编译/打包。(我已提出请求开发人员考虑更改为下一个版本的 Web 应用程序,但不会更改此版本)。

每当应用程序被回收(例如,对 web.config 进行更改)时,第一次命中时,ASP.NET JITs 应用程序。作为其中的一部分,它获取登录页面所需的所有程序集,并将它们编译为 Temporary ASP.NET Files 'assembly\dl3' 目录中的本机代码,这需要 20 到 60 秒。这只发生在回收站上,这种情况很少发生——但是当它发生时,它会导致页面加载时间更长,我相信有可能对此进行优化。

似乎有 122 个 DLL 需要考虑,其中一些是预编译的代码隐藏,其他是网站的第三方组件(例如 NHibernate.dll、报告组件等)

为什么它要重新编译/重新 JIT一切?为什么它没有检测到大多数程序集没有更改,并且没有尝试更改它们?我可以证明导致问题的不是批处理编译吗?(我<compilation debug="false"在 web.config 中设置了 >。)

其他问题表明 NGEN 可能有用,但我读到无法在 ASP.NET 1.x 上使用它;我们使用的是 2.0,无论哪种方式我都找不到一个干净的答案。

4

5 回答 5

2

你在运行 IIS 吗?我相当肯定,如果您在 IIS 中重新启动您的站点,它会在不复制 dll 的情况下获取对配置的任何更改。

于 2009-03-19T18:40:20.543 回答
2

您可以通过将不经常更改的常见 DLL(例如 NHibernate 或报告工具)安装到 GAC 中来缩短回收时间。这应该可以防止他们被重新调整。

如何:将程序集安装到全局程序集缓存中

于 2009-04-09T19:11:12.540 回答
2

从我个人的经验来看,如果你有很多实体,缓慢的回收通常是由 NHibernate/ActiveRecord 引起的。有关解释 + 可能的解决方案,请参阅http://nhibernate.info/blog/2009/03/13/an-improvement-on-sessionfactory-initialization.html 。

于 2009-04-11T17:32:52.463 回答
0

奇怪的是只复制dll需要20秒。我建议再做一次检查并确定瓶颈在哪里。

于 2009-03-19T23:12:14.943 回答
0

如果不回收/重置(或发生任何事情)AppDomain,您如何确定一切都处于正确状态?想象您在应用程序启动(global.asax)中有一些东西,它根据配置值设置静态字段的值。除非您重置整个 AppDomain,否则您无法确定。

另一个原因:一旦加载.NET dll,就无法卸载它,因此您必须在更新某些内容时重新创建应用程序域。

于 2009-04-13T20:55:05.910 回答