7

我也有一个使用 Umbraco 6 在 VS 2010 中创建的 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 以及我可以做些什么来阻止它?

非常感谢

理查德

4

3 回答 3

1

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

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

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

==在下面编辑==

在阅读了您的评论并再次发布后,我为您的问题创建了一个小解决方案。Umbraco 创建 App_Code 的事实仍然是因为没有 App_Code 存在的框架初始化将无法工作。但是,正如 OP 指出的那样,重新编译和创建自己的 Umbraco 分布会在升级等时产生一些额外的维护。

允许 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")));
            }
        }
    }
}
于 2013-07-01T16:23:25.167 回答
0

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

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

这意味着在构建站点时,引用被拉入并且更新站点很容易。这只是通过 NuGet 进行更新的问题。

于 2013-07-03T09:37:01.500 回答
0

这也发生在我身上,原来是因为“precompiledApp.config”文件不知何故进入了生产服务器……不知道这是怎么发生的,但是一旦我删除并回收了网络应用程序,这种情况就停止了。

于 2014-10-21T22:28:01.797 回答