似乎在新的MVC(
link)中没有支持动态捆绑,它应该使用gulp任务完成. MVC支持一些名为asp-append-version的新属性,但是我没有发现任何关于它的工作原理的解释.我怀疑它是计算文件内容的一些哈希,甚至在文件更改后更新它.有没有关于工作原理的文件?
解决方法
您可以查看
LinkTagHelper
源代码,您将看到它基本上是通过
FileVersionProvider
添加一个版本查询字符串到href值:
if (AppendVersion == true) { EnsureFileVersionProvider(); if (Href != null) { output.Attributes[HrefAttributeName].Value = _fileVersionProvider.AddFileVersionToPath(Href); } } private void EnsureFileVersionProvider() { if (_fileVersionProvider == null) { _fileVersionProvider = new FileVersionProvider( HostingEnvironment.WebRootFileProvider,Cache,ViewContext.HttpContext.Request.PathBase); } }
FileVersionProvider将使用SHA256算法计算文件内容的哈希值.然后它会将其编码并将其添加到查询字符串中,如:
path/to/file?v=B95ZXzHIoUQJzhBoHlSlNyN1_cOjJnz2DFsr-3ZyyJs
仅当文件更改时,才会重新计算哈希值,因为它将添加到缓存中,而是基于文件观察器的到期触发器:
if (!_cache.TryGetValue(path,out value)) { value = QueryHelpers.AddQueryString(path,VersionKey,GetHashForFile(fileInfo)); var cacheEntryOptions = new MemoryCacheEntryOptions().AddExpirationToken(_fileProvider.Watch(resolvedPath)); _cache.Set(path,value,cacheEntryOptions); }
这个观察者由HostingEnvironment.WebRootFileProvider提供,它实现IFileProvider:
// // Summary: // Creates a change trigger with the specified filter. // // Parameters: // filter: // Filter string used to determine what files or folders to monitor. Example: **/*.cs,// *.*,subFolder/**/*.cshtml. // // Returns: // An Microsoft.Framework.Caching.IExpirationTrigger that is triggered when a file // matching filter is added,modified or deleted. IExpirationTrigger Watch(string filter);
注意:您可以通过检查IMemoryCache中的值来自己查看缓存的值:
//give the link: <link rel="stylesheet" asp-append-version="true" href="~/css/site.css" /> //You can check the cached version this.Context.RequestServices.GetrequiredService<IMemoryCache>().Get("/css/site.css") //Which will show a value like: /css/site.css?v=B95ZXzHIoUQJzhBoHlSlNyN1_cOjJnz2DFsr-3ZyyJs