Wie erhalte ich System.Web.Optimization-Bundles für die Arbeit mit benutzerdefinierten Ordnern in einem virtuellen IIS-Verzeichnis?

Ich habe ein asp.net mvc4. Ich habe Module, die als Unterverzeichnisse in dieser Anwendung mithilfe von virtuellen IIS-Verzeichnissen bereitgestellt werden, und ich muss auf Dateien in diesen Modulen verweisen. Diese Modul-DLLs registrieren Bundles. Aber die Bundles erzeugen nichts in der HTML-Seite.

Von diesem Beitrag,ist-es-möglich-zu-unit-test-bundleconfig-in-mvc4 Ich sehe, dass die Bundles intern Server.MapPath verwenden. Es scheint also, als sollte es funktionieren.

Ich habe BundleTable.MapPathMethod angehängt und selbst Server.MapPath aufgerufen, was die korrekte Auflösung in das richtige physische Verzeichnis bewirkt. Aber es wird immer noch nichts in die HTML-Seite gerendert.

Dann gab es diesen Beitrag,Warum funktioniert Resolvebundleurl nicht für benutzerdefinierte Ordner? , die eine "AddDirectory" -Funktion für benutzerdefinierte Ordner erwähnte, ABER diese Funktion ist in der neuesten Optimierungsbibliothek nicht mehr verfügbar.

Ich habe auch versucht, die neue Methode "IncludeDirectory" zu verwenden, aber das hat auch nicht funktioniert

ScriptBundle scriptBundle = new ScriptBundle("~/bundles/jquery");
scriptBundle.IncludeDirectory(basePath + "/Scripts/","jquery-1.*");
bundles.Add(scriptBundle);

Kann ich sonst noch versuchen, das zum Laufen zu bringen?

27.08.12

PROBLEM BEANTWORTET: Grundsätzlich funktioniert System.Web.Optimization nicht mit Web-URLs, die virtuelle Unterverzeichnisse von IIS sind.

Das Problem sind diese Codezeilen in BundleResolver.GetBundleContents

string mapPathMethod = this.MapPathMethod("~/");
if (!file.FullName.StartsWith(mapPathMethod, StringComparison.OrdinalIgnoreCase))

Grundsätzlich wird davon ausgegangen, dass sich jede einzelne gebündelte Datei in einem Ordner PHYSICAL unterhalb des Ordners PHYSICAL der primären Webanwendung befindet.

Das Problem, IMO, ist, dass der relative URL-Pfad des Webs, der nach einzuschließenden Dateien durchsucht wird, sehr früh in einen physischen Pfad konvertiert wird und alle Verweise auf den relativen URL-Pfad, der zum Abrufen dieser physischen Dateien verwendet wird, verworfen werden.

Um zu sehen, ob ich diese Funktion nutzen konnte, musste ich System.Web.Optimization dekompilieren, um den Code freizugeben, und es dann erneut kompilieren, damit ich es "reparieren" konnte. Der erste Schritt bestand darin, BundleItem eine RelativePath-Eigenschaft und BundleItem einen zusätzlichen Konstruktor hinzuzufügen, um den relativen URL-Pfad der Quelle weiterzugeben und den Ordner des relativen Suchverzeichnisses für das Web beizubehalten. Dann habe ich den obigen Code durch die Schleife ersetzt, bevor im Grunde genommen versucht wurde, die mit ihrem BundleItem gefundenen Dateien erneut abzugleichen, damit sie wieder in eine gültige Web-URL konvertiert werden können

foreach (BundleItem bundleItem in bundleFor.Items)
{
  if (file.FullName.StartsWith(bundleItem.Path, StringComparison.OrdinalIgnoreCase)){
    string str = file.FullName.Replace(bundleItem.Path,bundleItem.RelativePath);
    str = str.Replace('\\', '/');
    strs.Add(str);
    break;
  }
}

Jetzt werden meine Bundles richtig gerendert. HINWEIS: Ich habe dieses Hackfix noch nicht für die Veröffentlichung oder mit Optimierungen oder Minimierungen getestet.

Ich denke wirklich, das asp.net-Team sollte System.Web.Optimizations-Unterstützungsdateien in virtuellen IIS-Verzeichnissen erstellen. Besonders jetzt, da der VS2012 IIS Express unterstützt, wird das Erstellen modularer Webanwendungen mit Dateien, auf die über virtuelle IIS-Verzeichnisse verwiesen wird, erheblich vereinfacht

Antworten auf die Frage(2)

Ihre Antwort auf die Frage