我们正在开发一个主WebApp,其中angularJS作为Cordova移动应用程序的单页应用程序。
我们已将部分静态资源移动到几个捆绑包中,这些捆绑包将从另一个域的不同CDN WebApp提供。
我们没有使用@Scripts.Render
@Styles.Render
razor帮助器,因为捆绑包是直接从移动应用程序内部的嵌入式静态index.html引用的(通过AngularJS附加):
<script src="https://service.foo.it/CDN/cdnFooJs"></script>
<script src="https://service.foo.it/CDN/cdnFooCss"></script>
由于我们没有使用剃须刀,我们不会向src附加任何缓存令牌,而这不是我们想要的;
我们需要一个版本令牌来强制客户端下载更新版本的捆绑包
我在some previous帖子中读到,每次使用Scripts.Render时都会计算v
令牌。
现在,问题是:
是否有可能以编程方式访问此令牌的值?
我们想创建一个服务控制器,给定一个bundle路由,返回bundle的SHA256令牌。
收到后,它将用于构建脚本标记,这些标记将被添加到DOM中。
<script src="https://service.foo.it/CDN/cdnFooJs?vtoken=asd3...."></script>
<script src="https://service.foo.it/CDN/cdnFooCss?vtoken=dasdasrq..."></script>
注意:
我们已经知道我们可以自己创建令牌(例如使用内部版本号),但是能够用更少的工作量和捆绑机制更多的东西很好。
答案 0 :(得分:5)
以下是从虚拟包路径获取v
令牌的简短示例。
public class BundleTokenController : ApiController
{
public string Get(string path)
{
var url = System.Web.Optimization.Scripts.Url(path).ToString();
//This will return relative url of the script bundle with querystring
if (!url.Contains("?"))
{
url = System.Web.Optimization.Styles.Url(path).ToString();
//If it's not a script bundle, check if it's a css bundle
}
if (!url.Contains("?"))
{
throw new Exception("Invalid path");
//If neither, the path is invalid,
//or something going wrong with your bundle config,
//do error handling correspondingly
}
return GetTokenFromUrl(url);
}
private static string GetTokenFromUrl(string url)
{
//Just a raw way to extract the 'v' token from the relative url,
//there can be other ways
var querystring = url.Split('?')[1];
return HttpUtility.ParseQueryString(querystring)["v"];
}
}