【问题标题】:MVC4 Bundling: where the URL for bundle is heldMVC4 捆绑:捆绑的 URL 所在的位置
【发布时间】:2013-10-01 11:21:37
【问题描述】:

当捆绑包在 MVC4 中注册时,是什么负责“拦截”传入的 http/bundles/someBundle?v=1hDzBpmYJm4Iu-OjRN1YqS1WeNThVl0kStLJGP8WCr41 的请求? 还因为每个捆绑包的哈希仅计算一次(在第一次请求时),实际持有的哈希在哪里, - 如果传入的哈希不匹配,是否可以返回 404

【问题讨论】:

  • 您要解决的实际问题是什么?
  • @CodeCaster 我需要 404 个带有旧/过时哈希的请求
  • ASP.NET MVC 的捆绑器不会自动执行此操作吗?
  • @CodeCaster 不,无论散列是否正确(甚至根本不存在),仍然会提供捆绑包
  • @dark_ruby 如果提供了捆绑包,有什么问题?当包发生变化时,哈希是为了防止缓存。带有不正确捆绑散列的链接甚至来自哪里?

标签: c# asp.net-mvc asp.net-mvc-4 bundling-and-minification system.web.optimization


【解决方案1】:

什么负责“拦截”对 ~/bundles/someBundle 的传入 http 请求

~/bundles/someBundle 没有传入请求。您正在使用的服务器端助手 (Scripts.Render) 在服务器上(在相同的 HTTP 请求中)解释此值并在生成的 HTML 中吐出正确的 url。

还因为每个捆绑包的哈希仅计算一次(在第一次请求时),实际保存在哪里,

实际的包内容存储在服务器端缓存中:HttpContext.Cache。实际哈希表示每次使用 Scripts.Render 帮助程序时计算的此内容的 SHA256 哈希。


更新:

当您引用 System.Web.Optimization 程序集时自动注册的是 System.Web.Optimization.BundleModule,该程序集负责拦截对像 /bundles/someBundle?v=1hDzBpmYJm4Iu-OjRN1YqS1WeNThVl0kStLJGP8WCr41 这样的 url 的请求并返回实际内容。

【讨论】:

  • 谢谢,那么是什么负责在生成的 HTML 中拦截“正确 url”的请求(为了更清楚,我已经更新了我的问题)
  • 是否可以插入 BundleModule,以添加所需的行为?
  • 不,这是不可能的,因为当您将 System.Web.Optimization 程序集引用到您的项目时,此模块是使用 PreApplicationStart 自动注册的。
【解决方案2】:

您的 Web 项目的 App_Start 文件夹中应该有一个名为 BundleConfig.cs 的文件。

该部分基本上将 URL“/bundles/something”链接到某些脚本。在以 Release 模式访问站点时(未激活调试),它会自动将脚本合并到一个内存文件中,最小化脚本,将缓存头添加到请求中并生成文件内容的哈希。

如果你在调试,所有的脚本都应该分开,以便于调试。

您可以重新定义您在该文件中看到的捆绑包,或者声明一些您自己的捆绑包。

享受吧。

【讨论】:

    【解决方案3】:

    根据您所服务的实际文件的内容附加带有参数的查询字符串的原因是为了解决缓存问题。所以你可以通知浏览器将这个请求缓存很长一段时间,并加快后续页面的加载时间。
    因此,对于这种捆绑机制的开发人员来说,该参数是什么没有区别。唯一重要的是,如果您更改脚本或 css 的内容 - 哈希值会发生变化,它将强制客户端浏览器从服务器请求新文件。
    至于负责拦截此请求的原因 - codeplex 上有可用的 MVC 源代码,但我猜它直接插入路由。

    【讨论】:

      猜你喜欢
      • 2012-06-21
      • 1970-01-01
      • 2013-04-02
      • 2012-07-22
      • 1970-01-01
      • 2012-10-15
      • 2012-06-28
      • 1970-01-01
      • 2012-09-16
      相关资源
      最近更新 更多