Blazor类库assets启动不可访问:跨项目读取settings.json方案?
Blazor WASM与类库共享settings.json的解决方案
核心问题说明
_content/BlazorClassLib/...是Blazor客户端访问类库静态资源的路由前缀,但服务端配置系统基于本地文件系统运行,无法直接识别该路由映射;WASM客户端受浏览器沙箱限制,不能直接读取本地文件,需通过HTTP请求获取资源。
服务端优雅访问方案
方案1:将settings.json设为嵌入式资源(推荐)
无需依赖文件复制,直接从类库程序集读取资源,路径更稳定:
- 在BlazorClassLib项目中,右键
wwwroot/settings.json→ 属性:- 生成操作:设置为「嵌入式资源」
- 复制到输出目录:设置为「不复制」
- 服务端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请求类库静态资源,步骤如下:
- 将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
相关产品推荐
相关产品推荐

