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

sys*_*out 6 c# asp.net-mvc angularjs single-page-application bundling-and-minification

我们正在开发一个主WebApp,其中angularJS作为Cordova移动应用程序的单页应用程序.

我们已将部分静态资源移动到几个捆绑包中,这些捆绑包将从另一个域的不同CDN WebApp提供.

我们没有使用@Scripts.Render @Styles.Render剃刀助手,因为捆绑包是直接从移动应用程序内部的嵌入式静态index.html引用的(通过AngularJS附加):

<script src="https://service.foo.it/CDN/cdnFooJs"></script>
<script src="https://service.foo.it/CDN/cdnFooCss"></script>
Run Code Online (Sandbox Code Playgroud)

因为我们没有使用剃刀,所以我们不会将任何缓存令牌附加到src,这不是我们想要的; 我们需要一个版本令牌来强制客户端下载更新版本的捆绑包.
我在之前一些帖子中读到,v每次使用Scripts.Render时都会计算令牌.

现在,问题是:
是否有可能以编程方式访问此令牌的值?

我们想创建一个服务控制器,给定一个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>
Run Code Online (Sandbox Code Playgroud)

注意:
我们已经知道我们可以自己创建令牌(例如使用内部版本号),但是拥有更少工作量并且更多地绑定到捆绑机制会更好.

小智 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"];
    }
}
Run Code Online (Sandbox Code Playgroud)