2012-08-22 135 views
131

我在用MVC4編寫的應用程序端口上運行應用程序。ASP.NET MVC框架4.5 CSS捆綁在主機上不起作用

捆綁的CSS文件不起作用。在我的本地計算機的調試模式下,我看到了應用程序的代碼,並且看到了這些文件。該應用程序按預期工作。

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

當我將應用程序上傳到Appharbor時,我在代碼中看到包但應用程序不起作用。

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

當我瀏覽的href該鏈接我得到403 - 禁止訪問:訪問被拒絕。

如何解決此問題?

+0

不知道你是否解決了這個問題,但本文修復了我的問題。 http://stackoverflow.com/a/18474844/955831 –

回答

268

我的猜測是路徑Content/css存在於您的應用程序的磁盤上。在這種情況下,IIS將處理請求,而不是MVC。

確保包的虛擬路徑(StyleBundle構造函數的參數)與文件系統中的文件夾不匹配。

從評論:

「一個好的習慣創建包時,遵循的是包括 ‘捆綁’作爲包名稱的前綴這將防止可能 路由衝突。」

+2

謝謝。在本地主機上運行時它工作正常嗎? –

+3

Thnaks這個答案 - 讓我瘋狂! –

+6

@RicardoPolo,「localhost」,你的意思是在你的開發機器上使用iis運行它嗎?然後是的,這很正常,因爲你很可能在調試模式下運行,禁止捆綁。 – bvgheluwe

2

這也適用於'ScriptBundle類',確保構造函數的'參數名稱'與Web應用程序文件系統中的路徑不匹配。請記住,IIS將嘗試提供文件/請求。

43

此問題默認情況下,.NET不會「處理」擴展名爲.js或.css的請求。

有兩種修復這個(你只需要做一)

A)從包名稱中刪除擴展。 (推薦)這將導致.NET處理請求並通過BundleModule運行它。

B)將此添加到您的web.config中的system.webServer部分,這將導致.NET通過BundleModule運行.js和.css請求。

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

大喊出雷摩洛誰在我的博客想通了實際的原因,並分享它與我: http://blog.cdeutsch.com/2012/11/fixing-404-errors-for-aspnet-mvc-apps.html

+0

更新了更多關於根本原因的信息和第二個選項。 – CDeutsch

+0

與404錯誤不是403有關。 –

+1

我遇到此問題是因爲我的包名稱是以「css」結尾的文件夾名稱。雖然我的捆綁包沒有完全保留文件,但是建議A引導我解決問題。 – dsnunez

0

我對此(403禁止)錯誤了同樣的問題。 在我的情況下,原因是我的組織中的代理服務器阻止了我的css文件。 Css文件名稱與塊規則之一匹配。

1

該問題也可能來自正在加密的文件。當我下載BootStrap並使用提供的文件時,發生了這種情況。他們在Windows資源管理器中顯示綠色,並且在Visual Studio中運行良好,但部署時出現403錯誤。

你可以看看他們是否通過去屬性,然後高級屬性,並有一個encypted複選框加密。

取消選中,它將不再是一個問題。

8

403錯誤解決。這裏是403錯誤的詳細解釋和解決方案。
The solution被演示爲CSS包。但是它也適用於JavaScript。

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

簡而言之,確保虛擬路徑[Script | Style]Bundle("~/content/[script | css]")沒有在文件系統中的文件夾相匹配(例如C:\approot\Content\[script | css]),而不是[Script | Style]Bundle("~/content/[scriptDiff | cssDiff]")

+1

謝謝,這是我遇到的問題。爲了解決這個問題,在BundleConfig.cs中,我將@ Styles.Render(「〜/ Content/css」)更改爲@ Styles.Render(「〜/ bundles/css」)。現在,它可以在調試模式下以本地方式運行時以及在發佈版或調試模式下發布時運行 –

+0

很好的答覆,但你不應該只留下一個鏈接,至少這篇文章的基本步驟在這裏是非常棒的,以防萬一鏈接網站關閉。 –

+0

@Victor M. Barbosa,好點。我已更新我的帖子。 – yantaq

3

我要做的很簡單,

我在ScriptBundle的末尾添加了「js」,如下所示:new ScriptBundle(「〜/ bundles/appjs」) 我在StyleBundle的末尾添加「css」,如下所示:new StyleBundle(「〜/ content/appcss「)

我的文件夾名稱永遠不會以「js」或「css」結尾。

這應該做到這一點。

18

當我嘗試在AppHarbor上部署ASP.NET MVC應用程序時,也發生了這種情況。

我曾與名

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

和文件夾結構的樣式束進行

- 內容

- 內容\引導\ ...

只需將軟件包名稱更改爲"~/Content/bootstrap-css" m問題得到解決。

+0

謝謝,這對我有用! – JReam

7

我知道我對這個問題遲了4年,但這對我有效。

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

    BundleTable.EnableOptimizations = true;  // Added this   
} 
+2

上面和下面的所有答案。這是唯一爲我工作的人。 –

+0

這使您可以在調試模式下進行優化。雖然這是一個檢查bundle是否在開發機器上工作的好方法,但不應該在代碼中留下這個聲明。 –

0

我發現文件bootstrap.css不在內容文件夾中,所以我在包中查找它並粘貼在那裏..它工作!