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

如何在ASP.NET MVC中让NewFontResolver读取wwwroot/fonts下的字体

解决跨平台读取ASP.NET MVC应用内字体目录的方案

1. 获取应用内字体目录的绝对路径

在ASP.NET MVC的启动逻辑中(.NET 6+用Program.cs,旧版本用Startup.cs),通过IWebHostEnvironment获取Web根目录,拼接得到字体文件夹的绝对路径:

var webHostEnv = builder.Services.BuildServiceProvider().GetRequiredService<IWebHostEnvironment>();
var fontDirectory = Path.Combine(webHostEnv.WebRootPath, "fonts");

Path.Combine会自动适配Windows(\)和Linux(/)的路径分隔符,无需手动处理。

2. 手动加载字体目录下的所有字体文件

绕过系统字体配置,直接遍历字体目录中的.ttf/.otf/.woff2等字体文件,手动注册到NewFontResolver中。这种方式完全不依赖系统环境变量,跨平台通用:

// 遍历字体目录下的所有字体文件(含子目录)
foreach (var fontFile in Directory.EnumerateFiles(fontDirectory, "*", SearchOption.AllDirectories)
                                 .Where(f => f.EndsWith(".ttf") || f.EndsWith(".otf") || f.EndsWith(".woff2")))
{
    // 读取字体文件流并注册到NewFontResolver
    using var fs = new FileStream(fontFile, FileMode.Open, FileAccess.Read);
    NewFontResolver.AddFont(fs);
}

3. Linux环境下的兼容优化(可选)

如果必须保留NewFontResolver的系统字体搜索逻辑,可在应用启动时临时修改FONTCONFIG_PATH环境变量,将自定义字体目录加入搜索路径(仅在Linux环境下执行):

if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
    // 保留系统原有字体路径,将自定义目录前置以优先加载
    var existingFontConfigPath = Environment.GetEnvironmentVariable("FONTCONFIG_PATH") ?? "/usr/share/fonts:/usr/local/share/fonts";
    Environment.SetEnvironmentVariable("FONTCONFIG_PATH", $"{fontDirectory}:{existingFontConfigPath}");
}

此方法让Linux下的NewFontResolver优先搜索应用内字体,同时保留系统字体可用性;Windows下不受影响,仍按默认逻辑读取字体。

注意事项

  • 确保wwwroot/fonts目录及其下的字体文件有可读权限(Linux下需执行chmod 644设置字体文件权限,chmod 755设置目录权限)。
  • 字体加载逻辑只需在应用启动时执行一次,避免重复加载。

内容的提问来源于stack exchange,提问作者Andrus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:12:17