ASP.net Core MVC项目给js文件添加版本号
需求:使用ASP.net Core Mvc开发公司内部web系统,给视图中js(css,image也可以)文件添加版本号避免缓存问题。
解决方法:利用Taghelper提供的标签(asp-append-version)可以实现
<script src="~/Scripts/Biz/VillageResource/XXXX.js" asp-append-version="true"></script>
效果:
备注:刷新页面js版本号不会变化,直到变动js内容变化,版本号才会变化。下文根据源码,了解asp-append-version是如何实现的。
if (AppendVersion == true){EnsureFileVersionProvider();if (Href != null){var index = output.Attributes.IndexOfName(HrefAttributeName);var existingAttribute = output.Attributes[index];output.Attributes[index] = new TagHelperAttribute(existingAttribute.Name,FileVersionProvider.AddFileVersionToPath(ViewContext.HttpContext.Request.PathBase, Href),existingAttribute.ValueStyle);}}
private void EnsureFileVersionProvider(){if (FileVersionProvider == null){FileVersionProvider = ViewContext.HttpContext.RequestServices.GetRequiredService<IFileVersionProvider>();}}
解析IFileVersionProvider的实现,然后调用AddFileVersionToPath方法添加版本号,AddFileVersionToPath源码如下:
public string AddFileVersionToPath(PathString requestPathBase, string path){if (path == null){throw new ArgumentNullException(nameof(path));}var resolvedPath = path;var queryStringOrFragmentStartIndex = path.IndexOfAny(QueryStringAndFragmentTokens);if (queryStringOrFragmentStartIndex != -1){resolvedPath = path.Substring(0, queryStringOrFragmentStartIndex);}if (Uri.TryCreate(resolvedPath, UriKind.Absolute, out var uri) && !uri.IsFile){// Don't append version if the path is absolute.return path;}if (Cache.TryGetValue(path, out string value)){return value;}var cacheEntryOptions = new MemoryCacheEntryOptions();cacheEntryOptions.AddExpirationToken(FileProvider.Watch(resolvedPath));var fileInfo = FileProvider.GetFileInfo(resolvedPath);if (!fileInfo.Exists &&requestPathBase.HasValue &&resolvedPath.StartsWith(requestPathBase.Value, StringComparison.OrdinalIgnoreCase)){var requestPathBaseRelativePath = resolvedPath.Substring(requestPathBase.Value.Length);cacheEntryOptions.AddExpirationToken(FileProvider.Watch(requestPathBaseRelativePath));fileInfo = FileProvider.GetFileInfo(requestPathBaseRelativePath);}if (fileInfo.Exists){value = QueryHelpers.AddQueryString(path, VersionKey, GetHashForFile(fileInfo));}else{// if the file is not in the current server.value = path;}cacheEntryOptions.SetSize(value.Length * sizeof(char));value = Cache.Set(path, value, cacheEntryOptions);return value;}private static string GetHashForFile(IFileInfo fileInfo){using (var sha256 = CryptographyAlgorithms.CreateSHA256()){using (var readStream = fileInfo.CreateReadStream()){var hash = sha256.ComputeHash(readStream);return WebEncoders.Base64UrlEncode(hash);}}}
通过AddFileVersionToPath源码可以弄明白:
js版本号 如何实现的?
在GetHashForFile方法,根据文件的内容利用SHA256算法得到其hash值,然后通过url编码得到js的版本号如:?v=b_XmH4_MtWTW4959ESAEqaO3-Tqh9QSlrJgwrQ1YplA
为什么更改了js文件内容,版本号会改变?
第一次得到版本号,会放入缓存中( value = Cache.Set(path, value, cacheEntryOptions);),同时缓存添加过期条件,判断依据文件是否发生变化( cacheEntryOptions.AddExpirationToken(FileProvider.Watch(requestPathBaseRelativePath));),否-直接或从缓存中获取。是-调用GetHashForFile方法重新生成。
动手添加个获取版本号的扩展方法
public static class HttpContextExtends{public static string AddFileVersionToPath(this HttpContext context, string path){return context.RequestServices.GetRequiredService<IFileVersionProvider>().AddFileVersionToPath(context.Request.PathBase, path);}}
view中使用
@p pageScript
{<script src=@Context.AddFileVersionToPath("/Scripts/Common/DataEnum.js")></script>
效果
ASP.net Core MVC项目给js文件添加版本号相关推荐
- ASP.NET Core MVC 项目 Autofac
目录 一:基本使用 二:简单理解Autofac容器 三:多种注册方式 四:构造函数注入 一:默认构造函数注入 二:选择一个构造函数参数的构造函数 五:属性注入 一:属性注入 二:属性注入扩展--指定属 ...
- asp.net core mvc上传大文件解决方案
asp.net core mvc上传大文件解决方案 参考文章: (1)asp.net core mvc上传大文件解决方案 (2)https://www.cnblogs.com/eggtwo/p/988 ...
- 使用ASP.NET Core MVC的Vue.Js
目录 内容主题 VUE.JS简介 DOT NET Core 下载和安装Visual Studio 2017 ASP.NET Core Spa模板 基础知识和设置 Node.js 节点包管理(NPM) ...
- 使用Vue.js和ASP.NET Core MVC实现CQRS模式
目录 介绍 先决条件 深入了解基本信息 应用解决方案结构 图像上传和显示应用 MVC与JS框架之间的通信设计 在SPA中,在表示层中添加UI和PLL 用于数据读取和写入操作的数据访问层 软件包安装 读 ...
- ASP.NET MVC 扩展HtmlHelper类为 js ,css 资源文件添加版本号
写在前面 在项目部署当中会需要更新 css 文件或 js 等资源文件,为了避免由于浏览器缓存的原因无法加载新的 css 或 js ,一般的做法是在资源文件的后面加上一个版本号来解决,这样浏览器就会去服 ...
- ASP.NET Core MVC+EF Core从开发到部署
笔记本电脑装了双系统(Windows 10和Ubuntu16.04)快半年了,平时有时间就喜欢切换到Ubuntu系统下耍耍Linux,熟悉熟悉Linux命令.Shell脚本以及Linux下的各种应用的 ...
- 为什么 web 开发人员需要迁移到. NET Core, 并使用 ASP.NET Core MVC 构建 web 和 API
2018 .NET开发者调查报告: .NET Core 是怎么样的状态,这里我们看到了还有非常多的.net开发人员还在观望,本文给大家一个建议.这仅代表我的个人意见, 我有充分的理由推荐.net 程序 ...
- 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)
1 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Microsoft Graph 服务针对一些主流的 ...
- 用Swashbuckle给ASP.NET Core的项目自动生成Swagger的API帮助文档
Swagger是一个描述RESTful的Web API的规范和框架.如果使用ASP.NET的话,可以用Swashbuckle来自动生成Swagger,具体参考如何使 WebAPI 自动生成漂亮又实用在 ...
最新文章
- 保姆级NLP学习路线来啦!
- pymysq向mysql写数据 为什么本地无法查看_从运维角度浅谈MySQL数据库优化,中小企业DBA必会...
- python中处理日期和时间的标准模块是-Python time模块参考手册
- 成幻Online Judge 1.00 Beta 正式发布 2007.6.22
- python web 程序的9种部署方式
- android+busybox+编译,Android版busybox编译
- 如何让多文本内容只显示一行,其余用省略号来显示
- 基于.net载发软件的下拉框(ComBox)无法显示数据问题
- 苹果iPhone SE 2概念视频放出:全面屏的小屏机
- java 计算两个日期之间的自然周
- text函数--Matplotlib
- Tableau过期处理方法
- 移动app抓包工具——fiddler抓包指南
- 新的深度学习模型可以准确识别睡眠阶段
- 麻省理工学院公开课:单变量微积分
- 国内知名流程管理软件-汇总介绍
- 小样本学习记录————利用所有数据的元学习Few-shot Text Classification with Distributional Signatures
- 捕食者-被捕食者方程组分析
- 从0开始一步一步安装walle
- 另类解决android中用三星手机拍的照片存储后旋转问题。