2012-08-22 151 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不在内容文件夹中,所以我在包中查找它并粘贴在那里..它工作!