Папка 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.