如何以编程方式获取捆绑版本令牌?

时间:2014-09-15 10:31:32

标签: c# asp.net-mvc angularjs single-page-application bundling-and-minification

我们正在开发一个主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>

注意
我们已经知道我们可以自己创建令牌(例如使用内部版本号),但是能够用更少的工作量和捆绑机制更多的东西很好。

1 个答案:

答案 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"];
    }
}