Папка App_Code создается автоматически на опубликованном веб-сайте

У меня есть приложение MVC4, созданное в VS 2010 с Umbraco 6, и я создал проект веб-развертывания, который используется моим CI-сервером Team City для развертывания моего веб-сайта в среде CI для тестирования.

На сервере CI при первой загрузке домашней страницы (или любой другой страницы) она загружается идеально. Однако при загрузке страницы создается папка App_Code на моем CI-сервере, и после этого я получаю сообщение "Каталог '/App_Code/' не разрешен, поскольку приложение предварительно скомпилировано". Удаление папки App_Code означает, что она снова работает при загрузке одной страницы, и папка создается снова.

Удаление файла PrecompiledApp.config приводит к тому, что мой сайт не загружается с помощью YSOD с надписью "Ссылка на объект не установлена ​​для экземпляра объекта". в следующей точке трассировки стека "Umbraco.Web.UmbracoModule.BeginRequest(HttpContextBase httpContext) +25"

Чтобы было ясно, у меня нет папки App_Code в моем проекте, и я не хочу или не нуждаюсь в ней. Все, что я хочу, это чтобы оно перестало создавать его автоматически при загрузке страницы! Я использовал Umbraco в VS и развертывал таким же образом много раз прежде, только не с Umbraco 6, а в проекте MVC.

Любые идеи, почему App_Code создается автоматически и что я могу сделать, чтобы остановить его?

Большое спасибо

Ричард

3 ответа

Кажется, я использую Umbraco таким же образом, как и вы, оборачивая его как проект MVC 4. Следовательно, он становится "Веб-приложением VS" вместо "Веб-сайта VS".

Важно помнить, что Umbraco изначально не предназначался для запуска в качестве приложения, и большая часть функциональности в Umbraco в первую очередь направлена ​​на использование App_Code.

Внутренние классы AssemblyExtensions, PluginManager, TypeHelper и открытый класс TypeFinder в Umbraco.Core имеют методы, которые зависят от наличия папки App_Code. Даже если вам не нужен App_Code в вашем решении, Umbraco делает, если вы не хотите видеть его, просто спрячьте его от своего решения. Если вы действительно не хотите, удалите все ссылки на него в источнике и создайте свой собственный сборник Umbraco.

== РЕДАКТИРОВАТЬ НИЖЕ ==

После прочтения вашего комментария и повторной публикации я создал небольшое решение для вашей проблемы. Тот факт, что Umbraco создает App_Code, все еще из-за инициализации платформы, которая не будет работать без существующего App_Code. Но перекомпиляция и создание собственного дистрибутива Umbraco, как указывает OP, создаст дополнительное обслуживание при обновлении и так далее.

Это не идеальный, но самый чистый способ решения этого вопроса, позволяющий Umbraco создавать папку App_Code, а также удалять ее после инициализации приложения. Я бы использовал IApplicationEventHandler. Пример кода работает на моей коробке.

using Umbraco.Core;
using Umbraco.Core.IO;

namespace YourNamespace.EventHandlers
{
    public class AppCodeEvents : IApplicationEventHandler
    {
        public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
        { }

        public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
        { }

        public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
        {
            if (System.IO.Directory.Exists(IOHelper.MapPath(IOHelper.ResolveUrl("~/App_Code"))))
            {
                System.IO.Directory.Delete(IOHelper.MapPath(IOHelper.ResolveUrl("~/App_Code")));
            }
        }
    }
}

Это происходило и со мной, оказалось, что файл precompiledApp.config каким-то образом попал на рабочий сервер... не знаю, как это произошло, но как только я удалил и переработал веб-приложение, это перестало происходить.

Если вы предварительно компилируете свой сайт с помощью проекта веб-развертывания, я предполагаю, что у вас есть все ваши ссылки, выделенные из проекта - что хорошо. Итак, я думаю, что простой ответ здесь - не прекомпилировать сайт, просто позволить веб-приложению быть построенным так, чтобы оно вытягивало ссылки и развертывало построенный проект.

Лично я считаю, что лучший способ работы с Umbraco v6 - через NuGet. Создайте пустой проект MVC4 и используйте NuGet для добавления Umbraco v6. Это автоматически отсортирует все ссылки для вас. Это потому, что эти фантастические парни из Umbraco создали два пакета Nuget, один с файлами проекта, а другой с основными DLL.

Это означает, что когда сайт создается, ссылки извлекаются, и обновление сайта легко. Это просто вопрос обновления через NuGet.

Другие вопросы по тегам