Il bundle CSS di ASP.NET MVC framework 4.5 non funziona sull'hosting


144

Sto eseguendo un'app su app harbor scritta in MVC4.

Un pacchetto di file CSS non funziona. Nel mio computer locale in modalità debug vedo il codice dell'app e vedo i file. L'app funziona come previsto.

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

Quando carico l'app su Appharbor vedo il pacchetto nel codice ma l'app non funziona.

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

Quando sfoglio quel link in hrefottengo 403 - Proibito: accesso negato.

Come risolvere questo?


Non sono sicuro se hai risolto questo problema ma questo articolo ha risolto il mio. stackoverflow.com/a/18474844/955831
Jason Foglia,

Risposte:


284

La mia ipotesi è che il percorso Content/css esista sul disco nella tua app. In questo caso IIS gestirà la richiesta, non MVC.

Assicurarsi che il percorso virtuale per il bundle (il parametro del costruttore StyleBundle) non corrisponda a una cartella nel file system.

Dai commenti:

"Una buona convenzione da seguire durante la creazione di pacchetti è quella di includere" pacchetto "come prefisso nel nome del pacchetto. Ciò impedirà un possibile conflitto di routing."


2
Grazie. È normale che funzioni quando è in esecuzione nell'host locale?
Ricardo Polo Jaramillo,

3
Grazie per questa risposta - mi stava facendo impazzire!
Rich Turner,

8
@RicardoPolo, per "localhost", intendi mentre lo esegui su iis express sulla tua macchina di sviluppo? Quindi sì, è normale che funzioni lì perché molto probabilmente stai eseguendo in modalità debug, che disabilita il raggruppamento.
bvgheluwe,

1
Grazie, questo mi stava facendo impazzire oggi
Xingyu,

11
+1 Questa risposta mi aiuta a capire come funzionano i percorsi virtuali con il raggruppamento. Ho letto il post originale su msdn ( asp.net/mvc/tutorials/mvc-4/bundling-and-minification ) ma dopo aver risolto il mio problema con la tua risposta, ho trovato alla fine del post un po 'di testo che parla di virtuale percorso: "Una buona convenzione da seguire quando si creano pacchetti è quella di includere" pacchetto "come prefisso nel nome del pacchetto. Ciò impedirà un possibile conflitto di routing.". Penso che questa frase DOVREBBE essere stata messa in grassetto con un'immagine di avvertimento rosso / giallo. : D Grazie!
Samuel,

45

Questo problema è per impostazione predefinita. NET non "elabora" le richieste con estensione .js o .css.

Ci sono due correzioni per questo (devi solo fare UNA)

A) Rimuovere le estensioni dai nomi dei pacchetti. (consigliato) Questo farà sì che .NET elabori la richiesta ed esegua BundleModule.

B) Aggiungi questo al tuo web.config nella sezione system.webServer che farà sì che .NET esegua le richieste .js e .css attraverso il BundleModule.

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

Grido a Ray Moro che ha capito la vera causa e l'ha condivisa con me sul mio blog: http://blog.cdeutsch.com/2012/11/fixing-404-errors-for-aspnet-mvc-apps.html


Aggiornato con ulteriori informazioni sulla causa principale insieme a una seconda opzione.
cdeutsch,

1
Stavo avendo questo problema perché il nome del mio pacchetto era un nome simile a una cartella che terminava con "css". Sebbene il mio bundle non abbia avuto esattamente un'estensione del file, il suggerimento A mi ha portato al problema.
dsnunez,

1
Questa dovrebbe essere la risposta corretta, mi aiuta con lo stesso problema.
psulek,

ottima risposta mi aiuta
DKR

Questa cosa con la sezione <module> mancante da web.config oh man ...
XDS

19

È successo anche a me, quando ho provato a distribuire la mia app ASP.NET MVC su AppHarbor.

Avevo un pacchetto di fogli di stile con il nome

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

e la struttura delle cartelle era

- Contenuto

- Contenuto \ Bootstrap \ ...

Semplicemente cambiando il nome del bundle per il "~/Content/bootstrap-css"mio problema è stato risolto.


15

So di essere in ritardo di 4 anni a questa domanda, ma ha funzionato per me.

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

   BundleTable.EnableOptimizations = true;     // Added this           
}

2
Di tutte le risposte sopra e sotto. Questo è l'unico che ha funzionato per me.
Haim Katz,

3
Ciò consente l'ottimizzazione quando si è in modalità debug. Mentre questo è un ottimo modo per verificare se i bundle funzionano su una macchina di sviluppo, non dovresti lasciare questa affermazione nel tuo codice.
Rudey,

9

403 errore risolto. ecco una spiegazione dettagliata e una soluzione per l'errore 403.
La soluzione è dimostrata per il bundle CSS. Tuttavia, si applica anche a JavaScript.

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

In poche parole, assicurati che il percorso virtuale [Script | Style]Bundle("~/content/[script | css]")non corrisponda a una cartella nel file system (ad es. C:\approot\Content\[script | css])[Script | Style]Bundle("~/content/[scriptDiff | cssDiff]")


2
Grazie, questo è il problema che ho riscontrato. Per risolverlo, in BundleConfig.cs ho cambiato il percorso da @ Styles.Render ("~ / Content / css") a @ Styles.Render ("~ / bundles / css"). Ora funziona quando si esegue localmente in modalità debug e quando viene pubblicato in modalità di rilascio o debug.
Ken Palmer,

Bella risposta, ma non dovresti lasciare solo un link, almeno i passaggi di base di questo articolo sarebbero fantastici da avere qui, nel caso in cui il sito web collegato non fosse attivo.
Vitor M. Barbosa,

5

Ho risolto il problema aggiungendo sotto la riga di codice nella classe BundleConfig

BundleTable.EnableOptimizations = false;

3

Quello che faccio è molto semplice,

Aggiungo "js" alla fine di ScriptBundle in questo modo: new ScriptBundle ("~ / bundles / appjs") E aggiungo "css" alla fine di StyleBundle in questo modo: new StyleBundle ("~ / content / appcss")

I nomi delle mie cartelle non finiscono mai con "js" o "css".

Questo dovrebbe farlo.


2

Questo vale anche per la "classe ScriptBundle", assicurarsi che il "nome parametro" per il costruttore non corrisponda a un percorso nel file system dell'applicazione Web. Ricorda che IIS proverà a servire il file / richiesta.


1

Il problema può anche provenire dal file crittografato. Questo mi è successo quando ho scaricato BootStrap e usato i file forniti. Hanno mostrato verde in Windows Explorer e hanno funzionato bene in Visual Studio, ma quando distribuito, ho ricevuto un errore 403.

Puoi vedere se sono crittografati andando su Proprietà, quindi su Proprietà avanzate e c'è una casella di controllo crittografata.

Deseleziona e non sarà più un problema.


0

Ho lo stesso problema con quell'errore (403 proibito). Nel mio caso il motivo è il server proxy nella mia organizzazione blocca il mio file CSS. Il nome del file CSS corrisponde a una delle regole di blocco.


0

Ho scoperto che il file bootstrap.css non si trovava nella cartella del contenuto, quindi l'ho cercato nei pacchetti e incollato lì .. ha funzionato!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.