You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定C#代码升级至.NET Core 6.0 & Episerver CMS 12?

.NET Core 6.0 下原有指纹生成代码的升级方案

报错原因及替换方案

  1. HttpRuntime.Cache 不存在:.NET Core 中不再使用HttpRuntime.Cache,改用IMemoryCache(进程内缓存,功能与原HttpRuntime.Cache一致)。
  2. HostingEnvironment 不存在:.NET Core 中用IWebHostEnvironment替代HostingEnvironment,通过其WebRootPath属性获取Web根目录路径,不再依赖MapPath解析~路径。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 08:47:29