Asp.net mvc Spark视图最初可以工作,但随后会得到一个;“动态视图编译失败”;大约30分钟后出错

Asp.net mvc Spark视图最初可以工作,但随后会得到一个;“动态视图编译失败”;大约30分钟后出错,asp.net-mvc,spark-view-engine,Asp.net Mvc,Spark View Engine,昨天将我的asp.NETMVC(带spark view引擎)项目推送到我们的live服务器后,我开始出现一个奇怪的错误。起初一切正常,但一段时间后(可能30分钟),视图开始抛出“动态视图编译失败”错误,并抱怨名称空间不存在。列出的名称空间的程序集位于bin中(因为它最初确实可以工作)。我在同一个盒子上运行的其他网站上使用了spark view引擎,似乎从来没有出现过这个问题。是什么导致这些视图停止工作?正如qstarin所提到的,回收应用程序池似乎确实会将程序集踢出。以下是有关该问题的原始Spa

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

正如qstarin所提到的,回收应用程序池似乎确实会将程序集踢出。以下是有关该问题的原始Spark讨论:

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

一个接一个地挑选程序集似乎仍然会给我带来随机的小故障,所以我在那篇讨论文章中调整了代码,并将其作为应用程序_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);
    }
}
然后您的应用程序启动()


有人提到一个已知的竞争条件错误加载程序集分散在这里和那里。我现在有一个AppDomain一直在顽固地抛出这个错误,以至于我们正在考虑在WebForms view engine中重新开发整个站点的前端。我想我终于找到了修复方法。我告诉spark通过调用.AddAssembly(“fullnameToAssembly”)加载我遇到问题的程序集,方法是对我们在MVCapApplication类中设置的SparkSettings进行调用。我想这也可以在_global.spark(因为名称空间引用可以在这两个地方设置)中完成,或者甚至可以在web.config(在spark部分下)中完成。它已经工作了一整天,而在我可以通过应用程序池循环触发错误之前,请不要问我为什么只有某些程序集需要它=这是个很棒的东西,很难找到。很高兴它对你有用!我应该更新一下。在我们似乎已经解决了(我发誓它在一天的大部分时间里都有效)之后,我们开始收到一个与LinkDemands相关的安全异常。在谷歌群组线程中,提到了一个安全异常,并给出了一个黑客攻击,但它并没有解决我们的异常。我们没能弄明白这一点,作为一家公司,我们决定不再在任何事情上使用Spark。谢天谢地,我们使用它的这个站点正在重新开发中,所以恢复到WinForms引擎并没有太多额外的工作(我们决定暂时不使用Razor/MVC3,仍然为时过早)。
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();
}