2013-06-28 21 views
7

Ich habe eine MVC4 App in VS 2010 mit Umbraco 6 erstellt und ich habe ein Web-Deploy-Projekt erstellt, das von meinem Team City CI-Server verwendet wird, um meine Website in eine CI-Umgebung zu implementieren testen.App_Code Ordner automatisch in der veröffentlichten Website erstellt

Auf dem CI-Server das erste Mal, wenn ich die Homepage (oder irgendeine Seite) lade lädt es völlig in Ordnung. Das Laden einer Seite erstellt jedoch einen App_Code-Ordner auf meinem CI-Server, und danach bekomme ich die Meldung "Das Verzeichnis '/ App_Code /' ist nicht erlaubt, weil die Anwendung vorkompiliert ist". Das Entfernen des App_Code-Ordners bedeutet, dass es erneut für das Laden einer Seite funktioniert und der Ordner erneut erstellt wird.

Das Entfernen der PrecompiledApp.config-Datei führt dazu, dass meine Website nicht mit einem YSOD geladen wird, der besagt, dass "Objektverweis nicht auf eine Objektinstanz festgelegt ist". an der folgenden Stelle in der Stack-Trace "Umbraco.Web.UmbracoModule.BeginRequest (HttpContextBase httpContext) +25"

Um klar zu sein, habe ich keinen App_Code-Ordner in meinem Projekt, und ich will nicht oder brauche einen. Alles, was ich will, ist, dass es beim Laden der Seite nicht automatisch erstellt. Ich habe Umbraco in VS verwendet und auf die gleiche Weise viele Male zuvor eingesetzt, nur nicht mit Umbraco 6 und in einem MVC-Projekt.

Irgendwelche Ideen, warum App_Code automatisch erstellt wird und was ich tun kann, um es zu stoppen?

Vielen Dank

Richard

Antwort

1

Ich scheine Umbraco in ähnlicher Art und Weise zu verwenden, wie Sie tun, es als ein MVC-4-Projekt Verpackung. Daher wird es zu einer "VS Web Application" anstelle einer "VS Web Site".

Wichtig zu erinnern ist, dass Umbraco ursprünglich nicht als Anwendung ausgeführt wurde und viele Funktionen von Umbraco in erster Linie auf die Verwendung von App_Code ausgerichtet sind.

Die internen Klassen AssemblyExtensions, PluginManager, TypeHelper und die öffentliche Klasse TypeFinder in Umbraco.Core haben Methoden, die davon abhängig sind, dass der App_Code-Ordner dort ist. Selbst wenn Sie in Ihrer Lösung keinen App_Code benötigen, tut Umbraco das, wenn Sie es nicht sehen wollen, verstecken Sie es einfach vor Ihrer Lösung. Wenn Sie es wirklich nicht wollen, entfernen Sie alle Verweise darauf in der Quelle und erstellen Sie Ihre eigene Kompilation von Umbraco.

== Bearbeiten Titel ==

Nachdem Sie Ihren Kommentar lesen und schreiben wieder habe ich eine kleine Lösung für Ihr Problem. Die Tatsache, dass Umbraco den App_Code erstellt, liegt immer noch an der Framework-Initialisierung, die ohne App_Code nicht funktionieren wird. Aber das Kompilieren und Erstellen eines eigenen Umbraco-Dienstes wird, wie OP hervorhebt, einige zusätzliche Wartung beim Upgraden und so weiter erzeugen.

Es ist nicht die ideale, aber die sauberste Möglichkeit, dies zu umgehen, damit Umbraco den Ordner App_Code erstellen kann, aber auch den Ordner entfernen kann, wenn die Anwendung initialisiert wurde. Ich würde einen IApplicationEventHandler verwenden. Der Beispielcode funktioniert auf meiner Box.

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

Danke Eric. Ich habe Umbraco schon mehrmals in einer VS-Web-App benutzt und hatte dieses Problem nie. Das war in älteren Versionen (4.0.x zum Beispiel) also ist dies ein Problem, das nur in neueren Versionen auftreten würde? Ich habe versucht, den leeren Ordner App_Code aus meiner Lösung auszuschließen, aber er erstellt ihn immer noch neu, wenn die Website nach dem Erstellen mit Team City ausgeführt wird, und löst die Fehler aus, die ich ursprünglich beschrieben habe. Sie sagen, dass Sie Dinge ähnlich wie ich tun - sind Sie hineingegangen und fangen an, Referenzen innerhalb des Umbraco-Codes zu entfernen? Vermutlich wird das dann zur Last, wenn man aufrüsten will. – richybailey

+0

Zustimmen, aktualisiert Post mit Codebeispiel, um Ihr Problem zu lösen –

+0

Ich stimme zu, dass der obige Code das Problem löst, aber es führt auch ein anderes Problem: Es verursacht die Anwendung bei jeder einzelnen Anforderung neu initialisiert, was ein großes Leistungsproblem ist. Vorläufig gehe ich davon aus, dass Umbraco-Sites nicht vorkompiliert werden können. –

0

Wenn Sie Ihre Website mit einem Web-deploy Projekt Vorkompilieren, ich nehme an, Sie alle Ihre Referenzen haben aus dem Projekt herausgetrennt - was eine gute Sache ist. Also, ich denke, die einfache Antwort hier ist, die Website nicht vorkompilieren, nur die Web-Anwendung zu ermöglichen, so dass es die Referenzen zieht und das erstellte Projekt bereitstellen erstellt.

Persönlich finde ich den besten Weg mit Umbraco v6 zu arbeiten ist über NuGet. Erstellen Sie ein leeres MVC4-Projekt und verwenden Sie NuGet, um Umbraco v6 hinzuzufügen. Dies wird automatisch alle Referenzen für Sie aussortieren. Das liegt daran, dass diese fantastischen Jungs von Umbraco zwei Nuget-Pakete erstellt haben, eines mit den Projektdateien und das andere mit den Kern-DLLs.

Das heißt, wenn die Site erstellt wird, werden die Referenzen eingezogen und das Aktualisieren der Site ist einfach. Es ist nur eine Frage der Aktualisierung über NuGet.

0

Das passierte mir auch, es stellte sich heraus, dass eine 'precompiledApp.config'-Datei irgendwie auf den Produktionsserver gelangt war ... nicht sicher, wie das passiert ist, aber sobald ich die Web-App gelöscht und recycelt hatte, hörte dies auf Ereignis.

+0

Ich habe den App_Code-Tanz gestoppt, indem ich die Datei precompiledApp.config gelöscht habe. Jetzt habe ich jede Menge Spaß mit Kompilierungsfehlern: _CS0433: Der Typ 'ASP.global_asax' existiert sowohl in 'c: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporäre ASP.NET-Dateien \ root \ 17b6aa3f \ 55a36928 \ Assembly \ dl3 \ 1f39276e \ 0041f4bb_8a98d001 \ App_global.asax.DLL 'und' c: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporäre ASP.NET-Dateien \ root \ 17b6aa3f \ 55a36928 \ App_global.asax. dtv9abzr.dll'_ –

+0

@OwenBlacker hast du jemals eine Lösung für dieses Problem gefunden? Ich habe den gleichen Fall :) – Squazz

+0

@Breeno wie hast du es funktioniert, ohne die precompiledApp.config vorhanden zu haben? Ich bekomme die gleiche Art von Fehlern wie Owen macht – Squazz

Verwandte Themen