Spark视图最初工作,但在30分钟左右后出现“动态视图编译失败”错误

时间:2010-10-08 17:29:35

标签: asp.net-mvc spark-view-engine

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

1 个答案:

答案 0 :(得分:5)

正如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);
    }
}

然后你的Application_Start():

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();
}