如何减少ASP.NET MVC 150MB + DLL的启动时间

时间:2016-06-04 19:36:16

标签: c# asp.net dll

我们的ASP.NET MVC 3.0应用程序中有大约200个DLL(大小为150MB +),开发中的启动时间约为60秒。

每当我们修改项目并重建它以获得要部署的新DLL时,一旦我们将新的DLL放入“webapp \ bin”文件夹,IIS也会重新JIT其他所有DLL(没有更改)这最多可占用1个CPU核心,大约需要60秒。

我可以做些什么来加快加载时间?

2 个答案:

答案 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在启动时加载它们,并且在实际加载时也不会签署验证。