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)
| 归档时间: |
|
| 查看次数: |
1208 次 |
| 最近记录: |