代码之家  ›  专栏  ›  技术社区  ›  herbrandson

Spark视图最初可以工作,但大约30分钟后出现“动态视图编译失败”错误

  •  4
  • herbrandson  · 技术社区  · 14 年前

    在昨天将我的asp.net mvc(带有spark视图引擎)项目推送到我们的live服务器之后,我开始遇到一个奇怪的错误。最初一切正常,但在一段时间(可能30分钟)之后,视图开始抛出“动态视图编译失败”错误,并抱怨名称空间不存在。列出的命名空间的程序集位于bin中(因为它最初确实起作用)。我在其他运行在同一个盒子上的网站上使用spark view引擎,但从来没有出现过这个问题。是什么导致这些视图停止工作?

    1 回复  |  直到 14 年前
        1
  •  5
  •   David R. Longnecker    14 年前

    正如qstarin所提到的,回收AppPool似乎确实会将程序集踢出程序集。以下是关于这个问题的最初的Spark讨论:

    http://groups.google.com/group/spark-dev/browse_thread/thread/dbee06a0d1b2766f#

    一般来说,该问题似乎是由Spark在AppPool有时间加载所有程序集之前尝试编译视图引起的。

    一个接一个地选择程序集似乎仍然会给我带来随机问题,因此我调整了讨论帖子中的代码,并将其作为Application_Start()中的第一行加载。从那时起,我已经推出了十几个应用程序,而且一次都没有看到预编译问题。

    private void PreLoadAssemblies()
    {
        // Deal with the compiling issue with Spark.
        var initialAssemblies = AppDomain.CurrentDomain.GetAssemblies();
        var di = new DirectoryInfo(Server.MapPath("~/bin"));
        var files = di.GetFiles("*.dll");
        foreach (var fi in files)
        {
            var found = false;
            //already loaded? 
            foreach (var asm in initialAssemblies)
            {
                var a = Assembly.ReflectionOnlyLoadFrom(fi.FullName);
                if (asm.FullName == a.FullName)
                    found = true;
            }
    
            if (!found)
                Assembly.LoadFrom(fi.FullName);
        }
    }
    

    然后你的应用程序启动:

    protected override void Application_Start(object sender, EventArgs e)
    {
        PreLoadAssemblies();
        base.Application_Start(sender, e);
    
        //Whatever else you normally do in Application_Start():
        MvcHandler.DisableMvcResponseHeader = true;
        ViewEngineManager.Configure(ViewEngines.Engines);
        RouteManager.RegisterRoutes(RouteTable.Routes);
        new InjectionManager().StartNinject();
    }