需求:使用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文件添加版本号相关推荐

  1. ASP.NET Core MVC 项目 Autofac

    目录 一:基本使用 二:简单理解Autofac容器 三:多种注册方式 四:构造函数注入 一:默认构造函数注入 二:选择一个构造函数参数的构造函数 五:属性注入 一:属性注入 二:属性注入扩展--指定属 ...

  2. asp.net core mvc上传大文件解决方案

    asp.net core mvc上传大文件解决方案 参考文章: (1)asp.net core mvc上传大文件解决方案 (2)https://www.cnblogs.com/eggtwo/p/988 ...

  3. 使用ASP.NET Core MVC的Vue.Js

    目录 内容主题 VUE.JS简介 DOT NET Core 下载和安装Visual Studio 2017 ASP.NET Core Spa模板 基础知识和设置 Node.js 节点包管理(NPM) ...

  4. 使用Vue.js和ASP.NET Core MVC实现CQRS模式

    目录 介绍 先决条件 深入了解基本信息 应用解决方案结构 图像上传和显示应用 MVC与JS框架之间的通信设计 在SPA中,在表示层中添加UI和PLL 用于数据读取和写入操作的数据访问层 软件包安装 读 ...

  5. ASP.NET MVC 扩展HtmlHelper类为 js ,css 资源文件添加版本号

    写在前面 在项目部署当中会需要更新 css 文件或 js 等资源文件,为了避免由于浏览器缓存的原因无法加载新的 css 或 js ,一般的做法是在资源文件的后面加上一个版本号来解决,这样浏览器就会去服 ...

  6. ASP.NET Core MVC+EF Core从开发到部署

    笔记本电脑装了双系统(Windows 10和Ubuntu16.04)快半年了,平时有时间就喜欢切换到Ubuntu系统下耍耍Linux,熟悉熟悉Linux命令.Shell脚本以及Linux下的各种应用的 ...

  7. 为什么 web 开发人员需要迁移到. NET Core, 并使用 ASP.NET Core MVC 构建 web 和 API

    2018 .NET开发者调查报告: .NET Core 是怎么样的状态,这里我们看到了还有非常多的.net开发人员还在观望,本文给大家一个建议.这仅代表我的个人意见, 我有充分的理由推荐.net 程序 ...

  8. 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

    1 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Microsoft Graph 服务针对一些主流的 ...

  9. 用Swashbuckle给ASP.NET Core的项目自动生成Swagger的API帮助文档

    Swagger是一个描述RESTful的Web API的规范和框架.如果使用ASP.NET的话,可以用Swashbuckle来自动生成Swagger,具体参考如何使 WebAPI 自动生成漂亮又实用在 ...

最新文章

  1. 保姆级NLP学习路线来啦!
  2. pymysq向mysql写数据 为什么本地无法查看_从运维角度浅谈MySQL数据库优化,中小企业DBA必会...
  3. python中处理日期和时间的标准模块是-Python time模块参考手册
  4. 成幻Online Judge 1.00 Beta 正式发布 2007.6.22
  5. python web 程序的9种部署方式
  6. android+busybox+编译,Android版busybox编译
  7. 如何让多文本内容只显示一行,其余用省略号来显示
  8. 基于.net载发软件的下拉框(ComBox)无法显示数据问题
  9. 苹果iPhone SE 2概念视频放出:全面屏的小屏机
  10. java 计算两个日期之间的自然周
  11. text函数--Matplotlib
  12. Tableau过期处理方法
  13. 移动app抓包工具——fiddler抓包指南
  14. 新的深度学习模型可以准确识别睡眠阶段
  15. 麻省理工学院公开课:单变量微积分
  16. 国内知名流程管理软件-汇总介绍
  17. 小样本学习记录————利用所有数据的元学习Few-shot Text Classification with Distributional Signatures
  18. 捕食者-被捕食者方程组分析
  19. 从0开始一步一步安装walle
  20. 另类解决android中用三星手机拍的照片存储后旋转问题。

热门文章

  1. UVa1607 poj1435 UVaLive1686 Gates
  2. IT English Collection(9) of Objective-C
  3. Horspool 字符串快速查找算法
  4. c语言编写程序计算行列式值,新手作品:行列式计算C语言版
  5. 百度新闻 谷歌新闻_每日新闻摘要:到目前为止,Google I / O提供的最佳信息
  6. windows rt_如何在Windows RT上轻松将网站添加到Flash白名单
  7. 如何使计算机为您读取文档
  8. 原生js打印指定节点元素
  9. vue3打包后无法加载页面
  10. Python的MySQLdb模块安装