获取MVC Bundle Querystring

时间:2015-07-21 13:15:55

标签: c# asp.net asp.net-mvc query-string bundling-and-minification

是否可以在ASP.NET MVC中检测bundle查询字符串?

例如,如果我有以下捆绑请求:

  

/css/bundles/mybundle.css?v=4Z9jKRKGzlz-D5dJi5VZtpy4QJep62o6A-xNjSBmKwU1

是否可以提取v查询字符串?:

  

4Z9jKRKGzlz-D5dJi5VZtpy4QJep62o6A-xNjSBmKwU1

我已尝试在捆绑转换中执行此操作,但没有运气。我发现即使将UseServerCache设置为false,转换代码也始终无法运行。

1 个答案:

答案 0 :(得分:4)

自从我使用ASP Bundler以来已经有一段时间了(我记得它是完全糟糕的),这些笔记来自我的记忆。请确认其仍然有效。 当我回到我的开发计算机上时,我会更新这个。希望这将为您的搜索提供一个起点。

要解决此问题,您需要在System.Web.Optimization命名空间中进行探索。

最重要的是System.Web.Optimization.BundleResponse类,它有一个名为GetContentHashCode()的方法,这正是你想要的。不幸的是,MVC Bundler有一个糟糕的架构,我愿意打赌这仍然是一个内部方法。这意味着您将无法通过代码调用它。

当我回到家(在我的开发箱上)时,我会尝试进一步探索这个命名空间

----- ----更新

感谢您的验证。所以看起来你有几种方法来实现你的目标:

1)使用与ASP Bundler

相同的算法计算你自己的哈希值

2)使用反射来调用Bundler的内部方法

3)从bundler获取url(我相信有一个公共方法)并提取出查询字符串,然后从中提取哈希值(使用任何字符串提取方法)

4)因为糟糕的设计而对微软感到愤怒

让我们选择#2(小心,因为它标记为内部而不是公共API的一部分,Bundler团队重命名该方法会打破你)

//This is the url passed to bundle definition in BundleConfig.cs
string bundlePath = "~/bundles/jquery";
//Need the context to generate response
var bundleContext = new BundleContext(new HttpContextWrapper(HttpContext.Current), BundleTable.Bundles, bundlePath);

//Bundle class has the method we need to get a BundleResponse
Bundle bundle = BundleTable.Bundles.GetBundleFor(bundlePath);
var bundleResponse = bundle.GenerateBundleResponse(bundleContext);

//BundleResponse has the method we need to call, but its marked as
//internal and therefor is not available for public consumption.
//To bypass this, reflect on it and manually invoke the method
var bundleReflection = bundleResponse.GetType();

var method = bundleReflection.GetMethod("GetContentHashCode", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

//contentHash is whats appended to your url (url?###-###...)
var contentHash = method.Invoke(bundleResponse, null);

bundlePath变量与您为该包提供的名称相同(来自BundleConfig.cs)

希望这有帮助!祝你好运!

编辑:忘了说在这个周围添加一个测试是个好主意。该测试将检查GetHashCode函数是否存在。这样,将来,如果Bundler的内部更改测试将失败,您将知道问题所在。