如何将指定C#代码升级至.NET Core 6.0 & Episerver CMS 12?
.NET Core 6.0 下原有指纹生成代码的升级方案
报错原因及替换方案
- HttpRuntime.Cache 不存在:.NET Core 中不再使用
HttpRuntime.Cache,改用IMemoryCache(进程内缓存,功能与原HttpRuntime.Cache一致)。 - HostingEnvironment 不存在:.NET Core 中用
IWebHostEnvironment替代HostingEnvironment,通过其WebRootPath属性获取Web根目录路径,不再依赖MapPath解析~路径。 - CacheDependency 不存在:.NET Core 无直接对应类型,改用
ChangeToken.OnChange监听文件变更,文件修改时自动移除对应缓存项,实现原缓存依赖的失效逻辑。
重构后的完整代码
.NET Core 6.0 默认已注册IMemoryCache和IWebHostEnvironment服务,将原静态方法改为依赖注入的实例方法:
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Caching.Memory; using System.IO; using System.Diagnostics; public class FileFingerprintService { private readonly IMemoryCache _cache; private readonly IWebHostEnvironment _webHostEnv; public FileFingerprintService(IMemoryCache cache, IWebHostEnvironment webHostEnv) { _cache = cache; _webHostEnv = webHostEnv; } public string Fingerprint(string rootRelativePath, string extension) { // 尝试从缓存获取结果 if (_cache.TryGetValue(rootRelativePath, out string cachedResult)) { return cachedResult; } // 构建绝对路径 var filePath = rootRelativePath.TrimStart('/'); if (!string.IsNullOrEmpty(extension)) { filePath = $"{filePath}.{extension}"; } var absolutePath = Path.Combine(_webHostEnv.WebRootPath, filePath); Debug.Assert(File.Exists(absolutePath), $"文件不存在:{absolutePath}"); var lastWriteTime = File.GetLastWriteTime(absolutePath); var index = rootRelativePath.LastIndexOf('/'); var result = rootRelativePath.Insert(index, $"/v-{lastWriteTime.Ticks}"); // 设置缓存并监听文件变更,文件修改时自动移除缓存 var cacheEntryOptions = new MemoryCacheEntryOptions() .AddExpirationToken(ChangeToken.OnChange( () => new FileInfo(absolutePath).Watchers, () => _cache.Remove(rootRelativePath))); _cache.Set(rootRelativePath, result, cacheEntryOptions); return result; } }
代码说明
- 原静态方法改为实例方法,通过构造函数注入依赖,符合.NET Core 依赖注入规范。
- 路径解析:直接用
WebRootPath拼接相对路径,替代原MapPath方法。 - 缓存依赖:通过
ChangeToken.OnChange监听文件变更,自动触发缓存移除,等价原CacheDependency的失效逻辑。 - 缓存操作:使用
IMemoryCache的TryGetValue和Set方法替代原HttpRuntime.Cache索引器操作。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

