El paquete CSS ASP.NET MVC framework 4.5 no funciona en el alojamiento


144

Estoy ejecutando una aplicación en el puerto de aplicaciones escrita en MVC4.

Un paquete de archivos CSS no funciona. En mi computadora local en modo de depuración veo el código de la aplicación y veo los archivos. La aplicación funciona como se esperaba.

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

Cuando subo la aplicación a Appharbor, veo el paquete en el código, pero la aplicación no funciona.

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

Cuando hojeo que enlazan en el hrefrecibo 403 - Prohibido: Acceso denegado.

¿Cómo solucionar este problema?


No estoy seguro si resolvió este problema, pero este artículo solucionó el mío. stackoverflow.com/a/18474844/955831
Jason Foglia

Respuestas:


284

Supongo que la ruta Content/cssexiste en el disco en su aplicación. En este caso, IIS estaría manejando la solicitud, no MVC.

Asegúrese de que la ruta virtual para el paquete (el parámetro del constructor StyleBundle) no coincida con una carpeta en el sistema de archivos.

De los comentarios:

"Una buena convención a seguir al crear paquetes es incluir" paquete "como prefijo en el nombre del paquete. Esto evitará un posible conflicto de enrutamiento".


2
Gracias. ¿Es normal que funcione cuando se ejecuta en el host local?
Ricardo Polo Jaramillo

3
Gracias por esta respuesta, ¡me estaba volviendo loco!
Rich Turner

8
@RicardoPolo, por "localhost", ¿quiere decir mientras lo ejecuta en iis express en su máquina de desarrollo? Entonces sí, es normal que funcione allí porque lo más probable es que se ejecute en modo de depuración, lo que deshabilita la agrupación.
bvgheluwe

1
Gracias, esto me estaba volviendo loco hoy
xingyu

11
+1 Esta respuesta me ayuda a comprender cómo funcionan las rutas virtuales con la agrupación. Leí la publicación original en msdn ( asp.net/mvc/tutorials/mvc-4/bundling-and-minification ) pero después de resolver mi problema con su respuesta, encontré al final de la publicación un poco de texto hablando sobre virtual ruta: "Una buena convención a seguir al crear paquetes es incluir" paquete "como prefijo en el nombre del paquete. Esto evitará un posible conflicto de enrutamiento". Creo que esta oración DEBE haber sido puesta en negrita con una imagen de advertencia roja / amarilla. : D Gracias!
Samuel

45

Este problema es por defecto .NET no "procesa" las solicitudes que tienen una extensión .js o .css.

Hay dos soluciones para esto (solo necesita hacer UNA)

A) Elimine las extensiones de los nombres de paquete. (recomendado) Esto hará que .NET procese la solicitud y la ejecute a través del BundleModule.

B) Agregue esto a su web.config en la sección system.webServer , lo que hará que .NET ejecute solicitudes .js y .css a través de BundleModule.

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

Gran agradecimiento a Ray Moro, quien descubrió la causa real y lo compartió conmigo en mi blog: http://blog.cdeutsch.com/2012/11/fixing-404-errors-for-aspnet-mvc-apps.html


Actualizado con más información sobre la causa raíz junto con una segunda opción.
cdeutsch

1
Estaba teniendo este problema porque el nombre de mi paquete era un nombre similar a una carpeta que terminaba en "css". Aunque mi paquete no tenía exactamente una extensión de archivo, la sugerencia A me llevó al problema.
dsnunez

1
Esta debería ser la respuesta correcta, me ayuda con el mismo problema.
psulek

gran respuesta me ayuda
DKR

Esta cosa con la sección <module> faltante de web.config oh man ...
XDS

19

También sucedió conmigo cuando intenté implementar mi aplicación ASP.NET MVC en AppHarbor.

Tenía un paquete de hojas de estilo con el nombre

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

y la estructura de carpetas era

-- Contenido

- Contenido \ Bootstrap \ ...

Simplemente cambiando el nombre del paquete a "~/Content/bootstrap-css"mi problema se volvió a resolver.


15

Sé que llegué 4 años tarde a esta pregunta, pero esto funcionó para mí.

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

   BundleTable.EnableOptimizations = true;     // Added this           
}

2
De todas las respuestas arriba y abajo. Este es el único que funcionó para mí.
Haim Katz

3
Esto permite optimizaciones cuando está en modo de depuración. Si bien esta es una excelente manera de verificar si los paquetes funcionan en una máquina de desarrollo, no debe dejar esta declaración en su código.
Rudey

9

Error 403 resuelto. Aquí hay una explicación detallada y una solución para el error 403.
La solución se demuestra para el paquete CSS. Sin embargo, también se aplica a JavaScript.

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

En pocas palabras, asegúrese de que la ruta virtual [Script | Style]Bundle("~/content/[script | css]")no coincida con una carpeta en el sistema de archivos (por ejemplo C:\approot\Content\[script | css])[Script | Style]Bundle("~/content/[scriptDiff | cssDiff]")


2
Gracias, este es el problema que experimenté. Para resolverlo, en BundleConfig.cs cambié la ruta de @ Styles.Render ("~ / Content / css") a @ Styles.Render ("~ / bundles / css"). Ahora funciona cuando se ejecuta localmente en modo de depuración y cuando se publica en versión o modo de depuración.
Ken Palmer

Buena respuesta, pero no debe dejar solo un enlace, al menos los pasos básicos de este artículo sería genial tenerlo aquí, en caso de que el sitio web vinculado esté caído.
Vitor M. Barbosa

5

Resolví el problema agregando la siguiente línea de código en la clase BundleConfig

BundleTable.EnableOptimizations = false;

3

Lo que hago es muy simple.

Agrego "js" al final de ScriptBundle así: nuevo ScriptBundle ("~ / bundles / appjs") Y agrego "css" al final de StyleBundle así: nuevo StyleBundle ("~ / content / appcss")

Los nombres de mis carpetas nunca terminan con "js" o "css".

Deberias hacer eso.


2

Esto también se aplica a la 'clase ScriptBundle', asegúrese de que el 'nombre del parámetro' para el constructor no coincida con una ruta en el sistema de archivos de la aplicación web. Recuerde que IIS intentará entregar el archivo / solicitud.


1

El problema también puede provenir del archivo que se cifra. Esto se me ocurrió cuando descargué BootStrap y usé los archivos suministrados. Se mostraron verdes en el explorador de Windows y funcionaron bien en Visual Studio, pero cuando se implementó, obtuve un error 403.

Puede ver si están encriptados yendo a propiedades, luego a propiedades avanzadas y hay una casilla de verificación encriptada.

Desmarque y ya no será un problema.


0

Tengo el mismo problema con ese error (403 prohibido). En mi caso, la razón es que el servidor proxy en mi organización bloquea mi archivo css. El nombre del archivo CSS coincide con una de las reglas de bloque.


0

Descubrí que el archivo bootstrap.css no estaba en la carpeta de contenido, así que lo busqué en los paquetes y lo pegué allí ... ¡funcionó!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.