Blazor WebAssembly 读取appsettings.json报文件未找到问题排查
问题根因
- 运行环境不匹配:你当前使用的手动构建配置的逻辑,是ASP.NET Core服务端/控制台应用的实现方式,完全不适配Blazor WebAssembly的浏览器运行环境。WASM代码全部在浏览器沙箱中执行,没有本地文件系统的访问权限,
Directory.GetCurrentDirectory()无法映射到浏览器可访问的静态资源路径,手动加载本地json文件的逻辑会直接失败,导致后续配置绑定拿到空值,DI解析服务时触发空引用类的错误。 - 静态资源路径不符合规则:Blazor WASM项目中需要被浏览器访问的静态文件(包括json配置)必须存放在
wwwroot目录下,存放在项目根目录的appsettings.json默认不会被打包到发布输出中,浏览器无法正常请求到对应文件。 - 配置体系相互隔离:你手动创建的Configuration实例,和WebAssemblyHostBuilder内置的配置系统是相互独立的,就算手动加载逻辑能跑通,也无法和Blazor本身的环境变量、内置配置逻辑打通。
修复方案
- 第一步:调整配置文件存放位置
- 将项目根目录下的
appsettings.json移动到wwwroot目录下,设置文件属性的「复制到输出目录」为「如果较新则复制」,确保构建过程中文件会被同步到静态资源输出目录。
- 将项目根目录下的
- 第二步:替换错误的手动配置加载逻辑,使用Blazor WASM内置的配置能力
- 删除所有手动构建Configuration的冗余代码,通过WebAssemblyHostBuilder自带的配置方法加载json文件,正确的Program.cs实现参考:
public static async Task Main(string[] args) { var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("#app"); // 内置加载wwwroot路径下的appsettings.json,无需手动处理文件路径 builder.Configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false); builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }) .AddScoped<IAuthenticationService, AuthenticationService>(); // 绑定Endpoints节点的强类型配置,两种注册方式二选一即可 // 方式1:使用官方推荐的Options模式注册 builder.Services.Configure<EndpointSettings>( builder.Configuration.GetSection("Endpoints") ); // 方式2:直接注册为瞬态实例 // builder.Services.AddTransient(_ => // builder.Configuration.GetSection("Endpoints").Get<EndpointSettings>() // ); builder.Services.AddTransient<IAuthClient, AuthClient>(); await builder.Build().RunAsync(); }
- 注意事项:
- 内置配置系统会自动适配浏览器的静态资源请求逻辑,从
wwwroot目录拉取配置文件,不存在沙箱权限的问题。 - 如果需要区分不同运行环境的配置,可以在
wwwroot下额外新增对应环境的json文件(比如appsettings.Development.json),开发调试时会自动优先加载环境专属的配置值。
- 内置配置系统会自动适配浏览器的静态资源请求逻辑,从
内容的提问来源于stack exchange,提问作者Charlston Manning
相关产品推荐
相关产品推荐

