获取MVC捆绑Querystring
是否有可能在ASP.NET MVC中检测捆绑查询字符串?
例如,如果我有以下捆绑请求:
/css/bundles/mybundle.css?v=4Z9jKRKGzlz-D5dJi5VZtpy4QJep62o6A-xNjSBmKwU1
是否有可能提取v
查询字符串?:
4Z9jKRKGzlz-D5dJi5VZtpy4QJep62o6A-xNjSBmKwU1
我试过在捆绑转换中这样做,但没有运气。 我发现即使将UseServerCache
设置为false
,转换代码也不会始终运行。
自从我与ASP Bundler合作以来,我已经有一段时间了(我记得它完全是狗屎),而这些笔记来自我的记忆。 请确认它仍然有效。 当我回到我的开发计算机时,我会更新它。 希望这将为您的搜索提供一个起点。
要解决这个问题,你需要在System.Web.Optimization命名空间中进行探索。
最重要的是System.Web.Optimization.BundleResponse类,它有一个名为GetContentHashCode()的方法,它正是你想要的。 不幸的是,MVC Bundler有一个糟糕的架构,我敢打赌,这仍然是一种内部方法。 这意味着你将无法从你的代码中调用它。
当我回家时,我会尝试进一步探索这个命名空间(在我的开发盒上)
-----更新----
感谢您的验证。 所以看起来你有几种方法来实现你的目标:
1)使用与ASP Bundler相同的算法计算哈希值
2)使用反射来调用Bundler的内部方法
3)从bundler获得URL(这是我相信有一个公共方法),并提取出查询字符串,然后从中提取散列(使用任何字符串extration方法)
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的内部部分改变测试将会失败,你就会知道问题出在哪里。
链接地址: http://www.djcxy.com/p/86761.html上一篇: Get MVC Bundle Querystring
下一篇: What coding techniques do you use for optimising C programs?