Das ASP.NET MVC Framework 4.5 CSS-Bundle funktioniert auf dem Hosting nicht

144

Ich führe eine App auf App Harbor aus, die in MVC4 geschrieben wurde.

Ein Bündel von CSS-Dateien funktioniert nicht. Auf meinem lokalen Computer im Debug-Modus wird der Code der App und die Dateien angezeigt. Die App funktioniert wie erwartet.

<link href="/Content/css/home/basic-jquery-slider.css" rel="stylesheet"/>
<link href="/Content/css/home/Home.css" rel="stylesheet"/>

Wenn ich die App auf Appharbor hochlade, wird das Bundle im Code angezeigt, aber die App funktioniert nicht.

<link href="/Content/css/home?v=zhVOIpUNuvCOZhJyBcQWpMlozayor4te6k-pM29wHqI1" rel="stylesheet"/>

Wenn ich diesen Link im durchsuche, hreferhalte ich 403 - Verboten: Der Zugriff wird verweigert.

Wie kann ich das beheben?

Ricardo Polo Jaramillo
quelle
Ich bin mir nicht sicher, ob Sie dieses Problem behoben haben, aber dieser Artikel hat mein Problem behoben. stackoverflow.com/a/18474844/955831
Jason Foglia

Antworten:

284

Ich vermute, dass der Pfad Content/cssin Ihrer App auf der Festplatte vorhanden ist. In diesem Fall würde IIS die Anforderung verarbeiten, nicht MVC.

Stellen Sie sicher, dass der virtuelle Pfad für das Bundle (der Parameter des StyleBundle-Konstruktors) nicht mit einem Ordner im Dateisystem übereinstimmt.

Aus den Kommentaren:

"Eine gute Konvention beim Erstellen von Bundles besteht darin," Bundle "als Präfix in den Bundle-Namen aufzunehmen. Dadurch wird ein möglicher Routing-Konflikt verhindert."

Paul
quelle
2
Vielen Dank. Ist es normal, dass es funktioniert, wenn es im localhost ausgeführt wird?
Ricardo Polo Jaramillo
3
Danke für diese Antwort - hat mich verrückt gemacht!
Rich Turner
8
@ RicardoPolo, mit "localhost", meinen Sie, während Sie es auf iis express auf Ihrem Entwicklungscomputer ausführen? Dann ist es normal, dass es dort funktioniert, da Sie höchstwahrscheinlich im Debug-Modus ausgeführt werden, wodurch die Bündelung deaktiviert wird.
Bvgheluwe
1
Danke, das hat mich heute wahnsinnig gemacht
xingyu
11
+1 Diese Antwort hilft mir zu verstehen, wie die virtuellen Pfade beim Bündeln funktionieren. Ich habe den Originalbeitrag auf msdn gelesen ( asp.net/mvc/tutorials/mvc-4/bundling-and-minification ), aber nachdem ich mein Problem mit Ihrer Antwort gelöst hatte, fand ich am Ende des Beitrags einen Text, der über virtuell sprach Pfad: "Eine gute Konvention beim Erstellen von Bundles besteht darin," Bundle "als Präfix in den Bundle-Namen aufzunehmen. Dies verhindert einen möglichen Routing-Konflikt." Ich denke, dieser Satz sollte fett mit einem rot / gelben Warnbild versehen sein. : D Danke!
Samuel
45

Dieses Problem ist, dass .NET standardmäßig keine Anforderungen mit der Erweiterung .js oder .css "verarbeitet".

Hierfür gibt es zwei Korrekturen (Sie müssen nur EINEN ausführen)

A) Entfernen Sie die Erweiterungen aus den Bundle-Namen. (empfohlen) Dadurch verarbeitet .NET die Anforderung und führt sie über das BundleModule aus.

B) Fügen Sie dies zu Ihrer web.config im Abschnitt system.webServer hinzu, wodurch .NET veranlasst, .js- und .css-Anforderungen über das BundleModule auszuführen.

<modules runAllManagedModulesForAllRequests="true">
  <remove name="BundleModule" />
  <add name="BundleModule" type="System.Web.Optimization.BundleModule" />
</modules>

Ein großes Dankeschön an Ray Moro, der die eigentliche Ursache herausgefunden und mir auf meinem Blog mitgeteilt hat : http://blog.cdeutsch.com/2012/11/fixing-404-errors-for-aspnet-mvc-apps.html

cdeutsch
quelle
Aktualisiert mit weiteren Informationen zur Grundursache sowie einer zweiten Option.
Deutsch
1
Ich hatte dieses Problem, weil der Name meines Bundles ein ordnerähnlicher Name war, der mit "css" endete. Obwohl mein Bundle nicht genau eine Dateierweiterung hatte, führte mich Vorschlag A zum Problem.
dsnunez
1
Dies sollte die richtige Antwort sein, sie hilft mir bei demselben Problem.
Psulek
tolle Antwort, es hilft mir
DKR
Diese Sache mit dem fehlenden <module> Abschnitt von web.config oh man ...
XDS
19

Passierte auch bei mir, als ich versuchte, meine ASP.NET MVC-App auf AppHarbor bereitzustellen.

Ich hatte ein Stylesheet-Bundle mit dem Namen

@Styles.Render("~/Content/bootstrap")

und die Ordnerstruktur war

- Inhalt

- Inhalt \ Bootstrap \ ...

Durch "~/Content/bootstrap-css"einfaches Ändern des Bundle-Namens in mein Problem wurde das Problem behoben.

Yasser Shaikh
quelle
15

Ich weiß, dass ich 4 Jahre zu spät zu dieser Frage komme, aber das hat bei mir funktioniert.

public static void RegisterBundles(BundleCollection bundles)
{
   ...

   BundleTable.EnableOptimizations = true;     // Added this           
}
RayLoveless
quelle
2
Von allen Antworten oben und unten. Dies ist der einzige, der für mich gearbeitet hat.
Haim Katz
3
Dies ermöglicht Optimierungen im Debug-Modus. Dies ist eine gute Möglichkeit, um zu überprüfen, ob Bundles auf einem Entwicklungscomputer funktionieren. Sie sollten diese Anweisung jedoch nicht in Ihrem Code belassen.
Rudey
9

403 Fehler behoben. Hier finden Sie eine detaillierte Erklärung und Lösung für den 403-Fehler.
Die Lösung wird für das CSS-Bundle demonstriert. Dies gilt jedoch auch für JavaScript.

http://www.mvccentral.net/Story/Details/articles/kahanu/stylebundle-403-error-solved

Stellen Sie kurz gesagt sicher, dass der virtuelle Pfad [Script | Style]Bundle("~/content/[script | css]")nicht mit einem Ordner im Dateisystem übereinstimmt (z. B. C:\approot\Content\[script | css])[Script | Style]Bundle("~/content/[scriptDiff | cssDiff]")

yantaq
quelle
2
Danke, das ist das Problem, das ich hatte. Um dies zu lösen, habe ich in BundleConfig.cs den Pfad von @ Styles.Render ("~ / Content / css") zu @ Styles.Render ("~ / bundles / css") geändert. Jetzt funktioniert es, wenn es lokal im Debug-Modus ausgeführt und im Release- oder Debug-Modus veröffentlicht wird.
Ken Palmer
Schöne Antwort, aber Sie sollten nicht nur einen Link hinterlassen, zumindest die grundlegenden Schritte dieses Artikels wären großartig, wenn die verlinkte Website nicht verfügbar wäre.
Vitor M. Barbosa
5

Ich habe das Problem gelöst, indem ich die folgende Codezeile in der BundleConfig-Klasse hinzugefügt habe

BundleTable.EnableOptimizations = false;
Ye Yint
quelle
3

Was ich mache ist sehr einfach,

Ich füge "js" am Ende von ScriptBundle wie folgt hinzu: new ScriptBundle ("~ / bundles / appjs") Und ich füge "css" am Ende von StyleBundle wie folgt hinzu: new StyleBundle ("~ / content / appcss")

Meine Ordnernamen enden nie mit "js" oder "css".

Das sollte es tun.

abelabbesnabi
quelle
2

Dies gilt auch für die 'ScriptBundle-Klasse'. Stellen Sie sicher, dass der 'Parametername' für den Konstruktor nicht mit einem Pfad im Webanwendungsdateisystem übereinstimmt. Denken Sie daran, dass IIS versucht, die Datei / Anforderung bereitzustellen.

Wilhelm
quelle
1

Das Problem kann auch von der zu verschlüsselnden Datei herrühren. Dies fiel mir ein, als ich BootStrap heruntergeladen und die mitgelieferten Dateien verwendet habe. Sie wurden im Windows Explorer grün angezeigt und funktionierten in Visual Studio einwandfrei. Bei der Bereitstellung wurde jedoch ein 403-Fehler angezeigt.

Sie können sehen, ob sie verschlüsselt sind, indem Sie zu Eigenschaften, dann zu erweiterten Eigenschaften und einem Kontrollkästchen mit Verschlüsselung wechseln.

Deaktivieren Sie und es wird kein Problem mehr sein.

Greg Gum
quelle
0

Ich habe das gleiche Problem mit diesem (403 Verbotenen) Fehler. In meinem Fall ist der Grund dafür, dass der Proxyserver in meiner Organisation meine CSS-Datei blockiert. Der CSS-Dateiname entspricht einer der Blockregeln.

Konstantin Orlow
quelle
0

Ich habe herausgefunden, dass sich die Datei bootstrap.css nicht im Inhaltsordner befindet, also habe ich sie in den Paketen gesucht und dort eingefügt. Es hat funktioniert!

Majid ALSarra
quelle