【问题标题】:MVC4 Bundles returns 404MVC4 捆绑包返回 404
【发布时间】:2013-03-13 18:42:56
【问题描述】:

当您从 Visual Studio 中运行它时,我有一个可以使用捆绑的项目。但是,在您进行部署之后,捆绑处理程序似乎永远不会选择路由。它最终转而转到静态文件处理程序,该处理程序返回 404 响应。

有什么想法吗?我在 IIS 下的网站的 bin 中看到了优化程序集。

它使用4.0应用程序池和集成模式。

我想知道是否有人有任何想法或建议?

谢谢

--根据问题更新-----

VS2012

targetFramework="4.5"

我还在视图中添加了一些代码来显示加载了哪些模块,我可以看到其中列出的捆绑模块。

BundleConfig 是使用 Internet Application MVC4 项目模板时提供的默认值。

该站点正在部署到根目录。奇怪的是,当我设置 EnableOptimizations = true 时(由于通过 Visual Studio F5 在调试模式下运行),它完美运行!我可以导航到内容/css,它会吐出组合的 css。

我部署它,其他一切正常,但捆绑!

【问题讨论】:

  • 可能是您的捆绑文件路径与应有的路径不同...
  • 运行时设置为 4.0 还是 4.5?检查 web.config。你用的是 VS2012 还是 2010?
  • 考虑到我正在发布到我的 IIS 文件夹并且其他所有内容都加载正常(视图、布局、图像),我看不出路径有什么错误。如果我手动引用 css 文件 /content/site.css 它会加载。但是当我点击 /content/css 时,bundlemodule 似乎没有拦截调用并加载捆绑的 css 内容!
  • 你的 BundleConfig 是什么样的?另外,您的站点是否部署到站点的根目录?
  • 这就是它应该工作的方式。 /css 在调试模式下不起作用,相反,Styles.Render("~/Content/css") 在调试模式下呈现指向单个 css 文件的链接。这就是为什么你应该使用Styles.Render() 而不是直接调用它的原因。

标签: c# asp.net-mvc-4 bundle


【解决方案1】:

我刚刚遇到(并解决了)这个问题。

确保您的包的虚拟路径不会与现有目录或实际文件名混淆。就我而言,我将其编码为:

bundles.Add(new ScriptBundle("~/bundles/main.js").Include( ...

但是当我把它改成

bundles.Add(new ScriptBundle("~/bundles/main").Include( ... 

一切都开始了。

【讨论】:

  • 我在访问 font awesome 字体时遇到了同样的问题,对于 其他解决方案,请尝试处理StyleBundle virtualpath 的这些链接:Link 1Link 2Link 3Link 4,希望这对某人有所帮助。
【解决方案2】:

2013 年 11 月 17 日更新的答案 这是因为默认的 MVC 路由只处理 * 而不是 * 。 *,即 IIS 或 IIS Express 的 applicationhost.config 有以下内容:

            <add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />

为了解决这个问题,我们可以在 web.config 中添加以下内容:

      <system.webServer>
        <handlers>      
          <add name="UrlRoutingHandler" 
               type="System.Web.Routing.UrlRoutingHandler, 
                     System.Web, Version=4.0.0.0, 
                     Culture=neutral, 
                     PublicKeyToken=b03f5f7f11d50a3a" 
               path="/bundles/*" 
               verb="GET"/>      
        </handlers>
      </system.webServer>

更多信息,您可以参考以下内容: http://weblogs.asp.net/owscott/archive/2013/01/16/handing-mvc-paths-with-dots-in-the-path.aspx ASP.NET MVC Url Route supporting (dot)

老错误答案: 基本上,IIS 解析 URL 时,虚拟路径中通常不允许使用 DOT。 这个a Link 提到了以下 URLScan AllowDotInPath 参数: 默认情况下,此选项设置为 0。如果此选项设置为 0,则 URLScan 拒绝任何包含多个句点 (.) 的请求。这可以防止通过在 URL 的路径信息或查询字符串部分中放置安全文件扩展名来伪装对危险文件扩展名的请求。例如,如果此选项设置为 1,则 URLScan 可能允许对 http:// servername/BadFile.exe/SafeFile.htm 的请求,因为它会将其解释为对 HTML 页面的请求,而实际上它是对PATH_INFO 区域中带有 HTML 页面名称的可执行 (.exe) 文件。当此选项设置为 0 时,URLScan 还可能拒绝对包含句点的目录的请求。

【讨论】:

  • 文档说它将拒绝包含多个句点的请求;这表明单个时期应该没问题。
  • @gerrod,最后一句表示:当此选项设置为 0 时,URLScan 也可能拒绝对包含句点的目录的请求。随着捆绑的工作方式,它将向生成的 URL 添加一些生成的哈希后缀。所以它会出现在虚拟目录中有一个点。因此它不起作用。
  • 嗯,不,这仍然不对。哈希作为查询字符串参数附加,例如bundles/main.js?v={hash}。我真的只是尝试过这个,你是路径中有多个句点会导致 URLScan 拒绝请求;但是有一个时期是可以的。
  • @gerrod,谢谢,你是对的,我的旧答案是错误的。我已经更新了答案。再次感谢,如果您认为这是正确的,请批准答案。谢谢!
  • 嗨@xinqiu;是的,这听起来更合理,感谢您修复它!
【解决方案3】:

即使我也遇到了同样的错误。 在 web.config 文件的&lt;system.webServer&gt; 下添加&lt;modules runAllManagedModulesForAllRequests="true" /&gt; 解决了这个问题。

【讨论】:

    【解决方案4】:

    即使使用示例 MVC 应用程序,我也遇到了同样的问题。我看到默认模板将样式表与 css 名称捆绑在一起,我猜 IIS 不喜欢这导致 404 错误。

    将包名称从 css 更改为 APPCSS 将为我解决问题。

    【讨论】:

      猜你喜欢
      • 2015-11-22
      • 2012-06-21
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 2014-09-01
      • 2012-11-20
      • 1970-01-01
      相关资源
      最近更新 更多