Виды Spark работают изначально, но после 30 минут или около того выдается ошибка «Ошибка динамической компиляции» - PullRequest
4 голосов
/ 08 октября 2010

Вчера, когда я перенес свой проект asp.net mvc (с движком искры) на наш работающий сервер, я начал получать странную ошибку.Сначала все работает нормально, но через некоторое время (возможно, через 30 минут) представления начинают выдавать ошибки «Ошибка динамической компиляции представления» и жалуются на то, что пространства имен не существует.Сборки для перечисленных пространств имен находятся в корзине (так как она работала изначально).Я использую движок Spark View на других веб-сайтах, работающих на том же компьютере, и никогда не сталкивался с этой проблемой.Что заставляет эти представления перестать работать?

1 Ответ

5 голосов
/ 12 октября 2010

Как упоминал 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();
}
...