Gói ASP.NET MVC framework 4.5 CSS không hoạt động trên hosting


144

Tôi đang chạy một ứng dụng trên bến cảng ứng dụng được viết bằng MVC4.

Một bó các tập tin css không hoạt động. Trong máy tính cục bộ của tôi ở chế độ gỡ lỗi, tôi thấy mã của Ứng dụng và tôi thấy các tệp. Ứng dụng hoạt động như mong đợi.

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

Khi tôi tải ứng dụng lên Appharbor, tôi thấy gói trong mã nhưng Ứng dụng không hoạt động.

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

Khi tôi duyệt liên kết đó trong hrefTôi nhận 403 - Cấm: Truy cập bị từ chối.

Làm thế nào để khắc phục sự cố này?


Không chắc chắn nếu bạn đã giải quyết vấn đề này nhưng bài viết này đã sửa lỗi của tôi. stackoverflow.com/a/18474844/955831
Jason Foglia

Câu trả lời:


284

Tôi đoán là đường dẫn Content/csstồn tại trên đĩa trong ứng dụng của bạn. Trong trường hợp này IIS sẽ xử lý yêu cầu, không phải MVC.

Đảm bảo rằng đường dẫn ảo cho gói (tham số của hàm tạo StyleBundle) không khớp với một thư mục trong hệ thống tệp.

Từ các ý kiến:

"Một quy ước tốt để tuân theo khi tạo các gói là bao gồm" gói "làm tiền tố trong tên gói. Điều này sẽ ngăn ngừa xung đột định tuyến có thể xảy ra."


2
cảm ơn. Nó có bình thường không khi nó chạy trong localhost?
Ricardo Polo Jaramillo

3
Thnaks cho câu trả lời này - đã khiến tôi phát điên!
Rich Turner

8
@RicardoPolo, bởi "localhost", ý bạn là trong khi chạy nó trên iis express trên máy phát triển của bạn? Vậy thì, điều bình thường là nó hoạt động ở đó bởi vì rất có thể bạn đang chạy trong chế độ gỡ lỗi, điều này vô hiệu hóa gói.
bvgheluwe

1
Cảm ơn bạn, điều này đã khiến tôi phát điên ngày hôm nay
xingyu

11
+1 Câu trả lời này giúp tôi hiểu cách các đường dẫn ảo hoạt động với gói. Tôi đã đọc bài viết gốc trên msdn ( asp.net/mvc/tutorials/mvc-4/bundling-and-minification ) nhưng sau khi giải quyết vấn đề của tôi bằng câu trả lời của bạn, tôi thấy ở cuối bài có một đoạn văn bản nói về ảo đường dẫn: "Một quy ước tốt để tuân theo khi tạo các gói là bao gồm" gói "làm tiền tố trong tên gói. Điều này sẽ ngăn ngừa xung đột định tuyến có thể xảy ra." Tôi nghĩ rằng câu này NÊN đã được in đậm với hình ảnh cảnh báo màu đỏ / vàng. : D Cảm ơn bạn!
Samuel

45

Vấn đề này theo mặc định .NET không "xử lý" các yêu cầu có phần mở rộng .js hoặc .css.

Có hai cách khắc phục cho việc này (bạn chỉ cần thực hiện MỘT)

A) Xóa các phần mở rộng khỏi tên gói. (được khuyến nghị) Điều này sẽ khiến .NET xử lý yêu cầu và chạy nó thông qua BundleModule.

B) Thêm phần này vào web.config trong phần system.webServer , điều này sẽ khiến .NET chạy các yêu cầu .js và .css thông qua BundleModule.

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

Tiếng hét lớn với Ray Moro, người đã tìm ra nguyên nhân thực sự và chia sẻ nó với tôi trên blog của mình: http://blog.cdeutsch.com/2012/11/fixing-404-errors-for-aspnet-mvc-apps.html


Cập nhật với nhiều thông tin hơn về nguyên nhân gốc cùng với tùy chọn thứ hai.
cdeutsch

1
Tôi đã gặp vấn đề này bởi vì tên của gói của tôi là một tên giống như thư mục kết thúc bằng "css". Mặc dù gói của tôi không chính xác có phần mở rộng tập tin, nhưng gợi ý A dẫn tôi đến vấn đề.
DSnunez

1
Đây phải là câu trả lời đúng, nó giúp tôi với cùng một vấn đề.
psulek 14/07/2015

câu trả lời tuyệt vời nó giúp tôi
DKR

Điều này với phần <module> bị thiếu từ web.config oh man ...
XDS

19

Cũng xảy ra với tôi, khi tôi thử triển khai ứng dụng ASP.NET MVC của mình trên AppHarbor.

Tôi đã có một gói bản định kiểu với tên

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

và cấu trúc thư mục là

-- Nội dung

- Nội dung \ Bootstrap \ ...

Chỉ cần thay đổi tên gói cho "~/Content/bootstrap-css"vấn đề của tôi đã được giải quyết.


15

Tôi biết tôi trễ 4 năm với câu hỏi này nhưng điều này hiệu quả với tôi.

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

   BundleTable.EnableOptimizations = true;     // Added this           
}

2
Trong tất cả các câu trả lời trên và dưới đây. Đây là người duy nhất làm việc cho tôi.
Haim Katz

3
Điều này cho phép tối ưu hóa khi bạn ở chế độ gỡ lỗi. Mặc dù đây là một cách tuyệt vời để kiểm tra xem các gói có hoạt động trên máy dev hay không, bạn không nên để câu lệnh này trong mã của mình.
Rudey

9

403 lỗi đã được giải quyết. Dưới đây là một lời giải thích chi tiết và giải pháp cho lỗi 403.
Giải pháp được thể hiện cho gói CSS. Tuy nhiên, nó cũng áp dụng cho JavaScript.

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

Tóm lại, hãy đảm bảo rằng đường dẫn ảo [Script | Style]Bundle("~/content/[script | css]")không khớp với thư mục trong hệ thống tệp (ví dụ C:\approot\Content\[script | css])[Script | Style]Bundle("~/content/[scriptDiff | cssDiff]")


2
Cảm ơn, đây là vấn đề mà tôi gặp phải. Để giải quyết nó, trong BundleConfig.cs tôi đã thay đổi đường dẫn từ @ Styles.Render ("~ / Content / css") thành @ Styles.Render ("~ / bundles / css"). Bây giờ nó hoạt động khi chạy cục bộ ở chế độ gỡ lỗi và khi được xuất bản ở chế độ phát hành hoặc gỡ lỗi.
Ken Palmer

Trả lời hay, nhưng bạn không nên chỉ để lại một liên kết, ít nhất là các bước cơ bản của bài viết này sẽ rất tuyệt nếu có ở đây, trong trường hợp trang web được liên kết bị sập.
Vitor M. Barbosa

5

Tôi đã giải quyết vấn đề bằng cách thêm dòng mã bên dưới vào lớp BundleConfig

BundleTable.EnableOptimizations = false;

3

Những gì tôi làm rất đơn giản,

Tôi thêm "js" vào cuối ScriptBundle như vậy: ScriptBundle mới ("~ / bundles / appjs") Và tôi thêm "css" vào cuối StyleBundle như vậy: StyleBundle mới ("~ / content / appcss")

Tên thư mục của tôi không bao giờ kết thúc bằng "js" hoặc "css".

Nên làm vậy.


2

Điều này cũng áp dụng cho 'lớp ScriptBundle', đảm bảo rằng 'tên tham số' cho hàm tạo không khớp với một đường dẫn trong hệ thống tệp ứng dụng web. Hãy nhớ rằng IIS sẽ cố gắng phục vụ tệp / yêu cầu.


1

Vấn đề cũng có thể đến từ các tập tin được mã hóa. Điều này xảy ra với tôi khi tôi tải BootStrap và sử dụng các tệp được cung cấp. Chúng hiển thị màu xanh lục trong Windows explorer và hoạt động tốt trong Visual Studio, nhưng khi được triển khai, tôi gặp lỗi 403.

Bạn có thể xem liệu chúng có được mã hóa hay không bằng cách đi tới các thuộc tính, sau đó là các thuộc tính nâng cao và có một hộp kiểm xác thực.

Bỏ chọn và nó sẽ không còn là vấn đề nữa.


0

Tôi có cùng một vấn đề với lỗi đó (403 Bị cấm). Trong trường hợp của tôi, lý do là máy chủ proxy trong tổ chức của tôi chặn tệp css của tôi. Tên tệp Css khớp với một trong các quy tắc khối.


0

Tôi phát hiện ra tệp bootstrap.css không có trong thư mục nội dung, vì vậy tôi đã tìm nó trong các gói và dán ở đó .. nó hoạt động!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.