2013-06-28 103 views
7

我有一个MVC4应用程序在VS 2010中有一把umbraco 6创建过,我已经创建了用于通过我的团队市CI服务器到我的网站部署到一个CI环境中的网络部署项目测试。App_Code文件夹

在CI服务器上第一次加载主页(或任何页面)时,它的加载非常好。然而,加载页面的行为会在我的CI服务器上创建一个App_Code文件夹,之后我会收到消息“不允许该目录/ App_Code /因应用程序被预编译”。删除App_Code文件夹意味着它再次适用于一个页面加载,并且该文件夹被重新创建。

删除PrecompiledApp.config文件会导致我的网站不与YSOD陈述加载“未设置为一个对象的实例对象引用。”在下面的堆栈跟踪点“Umbraco.Web.UmbracoModule.BeginRequest(HttpContextBase httpContext)+25”

要清楚,需要一个。我只想让它在页面加载时自动停止创建一个!我曾经在VS中使用过Umbraco,并且之前多次部署过相同的方式,而不是Umbraco 6和MVC项目。

任何想法为什么App_Code被自动创建,我能做些什么来阻止它?

非常感谢

理查德

回答

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的一个自己的分支将作为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"))); 
      } 
     } 
    } 
} 
+0

谢谢埃里克。我之前在VS Web应用程序中使用过Umbraco,并且从未遇到过这个问题。这是在旧版本(例如4.0.x),这是一个问题,只会发生在较新的版本? 我曾尝试从我的解决方案中排除空的App_Code文件夹,但当网站在与Team City一起构建后运行时仍会重新创建该文件夹,并引发最初描述的错误。 你说你运行类似于我的东西 - 你是否进入并开始去除Umbraco代码中的引用?想要升级时,这可能会成为一种负担。 – richybailey

+0

同意,更新后的代码示例解决您的问题 –

+0

我同意上面的代码解决了问题,但它也引入了另一个问题:它导致应用程序重新初始化每个请求,这是一个巨大的性能问题。就目前而言,我会在Umbraco网站无法预编译的假设下继续前进。 –

0

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

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

这意味着,当网站建成后,引用被拉入并更新网站很容易。这只是通过NuGet更新的问题。

0

这也发生在我身上,原来是因为'precompiledApp.config'文件以某种方式进入了生产服务器......不知道这是怎么发生的,但是一旦我删除并回收了这个停止的Web应用程序发生。

+0

我停止通过删除precompiledApp.config文件来获取App_Code舞蹈。现在,我对编译错误有种种乐趣:_CS0433:类型'ASP.global_asax'存在于'c:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root \ 17b6aa3f \ 55a36928 \ assembly \ dl3 \ 1f39276e \ 0041f4bb_8a98d001 \ App_global.asax.DLL'和'c:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root \ 17b6aa3f \ 55a36928 \ App_global.asax。 dtv9abzr.dll'_ –

+0

@OwenBlacker你有没有找到解决这个问题的办法?我有同样的情况:) – Squazz

+0

@Breeno你是如何在没有precompiledApp.config的情况下工作的?我得到的错误类型与Owen相同 – Squazz