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

Blazor类库assets启动不可访问:跨项目读取settings.json方案?

Blazor WASM与类库共享settings.json的解决方案

核心问题说明

_content/BlazorClassLib/...是Blazor客户端访问类库静态资源的路由前缀,但服务端配置系统基于本地文件系统运行,无法直接识别该路由映射;WASM客户端受浏览器沙箱限制,不能直接读取本地文件,需通过HTTP请求获取资源。


服务端优雅访问方案

方案1:将settings.json设为嵌入式资源(推荐)

无需依赖文件复制,直接从类库程序集读取资源,路径更稳定:

  1. 在BlazorClassLib项目中,右键wwwroot/settings.json → 属性:
    • 生成操作:设置为「嵌入式资源」
    • 复制到输出目录:设置为「不复制」
  2. 服务端Program.cs中读取配置:
using System.Reflection;
using System.Text.Json;

// 获取类库程序集(替换为类库中任意存在的类型)
var libAssembly = typeof(BlazorClassLib.YourLibraryClass).Assembly;
// 嵌入式资源名称格式:项目默认命名空间 + 文件路径(斜杠替换为点)
var resourceName = "BlazorClassLib.wwwroot.settings.json";

// 读取资源流并加载到配置
using var stream = libAssembly.GetManifestResourceStream(resourceName);
if (stream == null)
{
    throw new FileNotFoundException("未找到嵌入式资源settings.json", resourceName);
}
configurationManager.AddJsonStream(stream);

// 绑定并注入Settings实例
var settings = configurationManager.Get<Settings>();
services.AddSingleton(settings);

可通过libAssembly.GetManifestResourceNames()打印所有嵌入式资源名称,确认资源名称是否正确。

方案2:构建时自动复制类库资源到服务端

在BlazorClassLib的.csproj中添加配置,将settings.json自动复制到服务端输出目录:

<ItemGroup>
  <Content Include="wwwroot\settings.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    <DestinationSubDirectory>wwwroot\_content\BlazorClassLib</DestinationSubDirectory>
  </Content>
</ItemGroup>

之后服务端可通过物理路径读取:

var filePath = Path.Combine(builder.Environment.WebRootPath, "_content", "BlazorClassLib", "settings.json");
configurationManager.AddJsonFile(filePath, optional: false, reloadOnChange: true);

WASM客户端访问方案

客户端需通过HttpClient请求类库静态资源,步骤如下:

  1. 将WASM客户端的Program.cs改为异步启动:
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");

// 注册HttpClient(默认已包含)
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

// 读取settings.json并注入
var serviceProvider = builder.Services.BuildServiceProvider();
var httpClient = serviceProvider.GetRequiredService<HttpClient>();
using var stream = await httpClient.GetStreamAsync("_content/BlazorClassLib/settings.json");
var settings = await JsonSerializer.DeserializeAsync<Settings>(stream, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });

builder.Services.AddSingleton(settings);

await builder.Build().RunAsync();

确保BlazorClassLib已被客户端项目引用,且类库的settings.json生成操作保持默认的「内容」类型。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:23:17