我们的ASP.NET MVC 3.0应用程序中有大约200个DLL(大小为150MB +),开发中的启动时间约为60秒。
每当我们修改项目并重建它以获得要部署的新DLL时,一旦我们将新的DLL放入“webapp \ bin”文件夹,IIS也会重新JIT其他所有DLL(没有更改)这最多可占用1个CPU核心,大约需要60秒。
我可以做些什么来加快加载时间?
答案 0 :(得分:4)
最简单的方法是不将所有应用程序DLL放入IIS监视的webapp \ bin中。您可以使用AppDomain.AssemblyResolve Event从自定义位置利用动态DLL加载。
为此,您需要在HttpModule
web.config
</configuration>
</system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="CAssemblyResolveHttpModule"/>
<add name="CAssemblyResolveHttpModule"
type="CAssemblyResolveHttpModule"/>
</modules>
</system.webServer>
</configuration>
并为其实施:
public class CAssemblyResolveHttpModule : IHttpModule
{
public void Init(System.Web.HttpApplication iContext)
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
private Assembly CurrentDomain_AssemblyResolve(
object iSender,
ResolveEventArgs iArgs)
{
return Assembly.LoadFrom(...);
}
}
除此之外,当bin文件夹通过IIS设置更改时,您可以阻止IIS回收ASP.NET应用程序:
Can I prevent IIS from recycling if /bin changes 这很简单:
在Application Pool > Advanced Settings > Recycling
部分中,将Disable Recyling for Configuation Changes
设置为True
。
如果将大多数DLL移出app bin文件夹,IIS应用程序池回收将花费不会超过几分钟。为了赶上另一个新的DLL版本,您需要回收应用程序池。
如果您仍希望完全避免应用程序池回收,则可以使用自定义应用程序域池的策略。在这里,您可以获得代码示例:Create custom AppDomain and add assemblies to it
答案 1 :(得分:0)
如果大多数DLL没有立即使用,您可以将它们放在GAC中。这可以防止ASP.Net在启动时加载它们,并且在实际加载时也不会签署验证。