App_Code文件夹在已发布的网站中自动创建

时间:2013-06-28 16:20:55

标签: asp.net-mvc-4 umbraco app-code

我在VS 2010中使用Umbraco 6创建了一个MVC4应用程序,我创建了一个Web部署项目,我的Team City CI服务器使用该项目将我的网站部署到CI环境进行测试。

在CI服务器上第一次加载主页(或任何页面)时,它加载完全正常。但是,加载页面的行为会在我的CI服务器上创建一个App_Code文件夹,然后我收到消息“由于应用程序已预编译,因此不允许使用目录'/ App_Code /'”。删除App_Code文件夹意味着它再次适用于一个页面加载,并再次创建该文件夹。

删除PrecompiledApp.config文件会导致我的网站无法加载YSOD,声明“对象引用未设置为对象的实例”。在堆栈跟踪中的以下点“Umbraco.Web.UmbracoModule.BeginRequest(HttpContextBase httpContext)+25”

要清楚,我的项目中没有App_Code文件夹,我不想要或不需要。我只想让它在页面加载时自动停止创建一个!我在VS中使用了Umbraco并且以相同的方式多次部署,只是没有使用Umbraco 6和MVC项目。

为什么会自动创建App_Code以及我可以做些什么来阻止它?

非常感谢

理查德

3 个答案:

答案 0 :(得分:1)

我似乎以类似的方式使用Umbraco,将其包装为MVC 4项目。因此它变成了“VS Web应用程序”而不是“VS网站”。

重要的是要记住,Umbraco最初并不是作为应用程序运行的,而且Umbraco中的许多功能首先是针对使用App_Code。

Umbraco.Core中的内部类AssemblyExtensions,PluginManager,TypeHelper和公共类TypeFinder具有依赖于App_Code文件夹的方法。即使您在Umbraco的解决方案中不需要App_Code,如果您不想看到它只是将其隐藏在您的解决方案中。如果你真的不希望它删除源代码中对它的所有引用,并创建自己的Umbraco编译。

==以下编辑==

在阅读您的评论并再次发布后,我为您的问题创建了一个小解决方案。 Umbraco创建App_Code的事实仍然是因为框架初始化在没有App_Code存在的情况下无法工作。但是,重新编译和创建自己的Umbraco dist会在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")));
            }
        }
    }
}

答案 1 :(得分:0)

如果您使用Web部署项目预编译您的站点,我假设您已将所有引用从项目中分离出来 - 这是一件好事。因此,我认为这里的简单答案是不要预先编译网站,只需允许构建Web应用程序,以便它引入引用并部署构建的项目。

就个人而言,我发现使用Umbraco v6的最佳方式是通过NuGet。创建一个空的MVC4项目并使用NuGet添加Umbraco v6。这将自动为您排序所有参考。这是因为Umbraco的那些出色的人创建了两个Nuget包,一个包含项目文件,另一个包含核心DLL。

这意味着在构建站点时,会引入引用并轻松更新站点。这只是通过NuGet进行更新的问题。

答案 2 :(得分:0)

这也发生在我身上,原来这是因为预编译的App.config'文件已经以某种方式进入生产服务器...不确定是怎么发生的,但是一旦我删除并回收了Web应用程序,这种情况就不再发生了。