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

.NET 7 Blazor WASM读取appsettings.json始终为空的最优解决方法

问题

将项目从.NET Core 3.1迁移至.NET 7的Blazor WASM应用时,无法正常读取wwwroot目录下的appsettings.json配置。尝试在Program.cs中通过builder.Configuration.GetSection("API:Path").Value获取配置值,但始终返回null。需要在构建宿主前获取配置以定义服务,寻求符合最佳实践的解决方案。

现有代码

Program.cs

using BlazorWASM;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;

namespace Company.WebApplication1;

public class Program
{
    public static async Task Main(string[] args)
    {
        var builder = WebAssemblyHostBuilder.CreateDefault(args);
        builder.RootComponents.Add<App>("#app");
        builder.RootComponents.Add<HeadOutlet>("head::after");

        string APIPath = builder.Configuration.GetSection("API:Path").Value; // 此处返回null

        builder.Services.AddSingleton(sp => new HttpClient { BaseAddress = new Uri(APIPath) });

        await builder.Build().RunAsync();
    }
}

wwwroot/appsettings.json

{
      "API": {
        "Path": "https://api.somewebsite.com/"
      },
      "ConnectionStrings": {
        "DefaultConnection": "Server=localhost;Database=_CHANGE_ME;Trusted_Connection=True;"
      }
}

解决方案

方法1:修复直接读取逻辑

WebAssemblyHostBuilder.CreateDefault(args)默认会自动加载wwwroot下的appsettings.json,改用更可靠的GetValue方法读取并增加空值校验:

string APIPath = builder.Configuration.GetValue<string>("API:Path") 
    ?? throw new InvalidOperationException("未找到API:Path配置项");

builder.Services.AddSingleton(sp => new HttpClient { BaseAddress = new Uri(APIPath) });

方法2:延迟配置获取(推荐最佳实践)

通过依赖注入在服务初始化时动态获取配置,避免提前读取导致的空值问题,同时符合DI设计原则:

builder.Services.AddHttpClient("ApiClient", (sp, client) =>
{
    var config = sp.GetRequiredService<IConfiguration>();
    string apiPath = config.GetValue<string>("API:Path") 
        ?? throw new InvalidOperationException("未找到API:Path配置项");
    client.BaseAddress = new Uri(apiPath);
});

后续在组件或服务中通过IHttpClientFactory获取命名客户端即可:

public class MyComponent(IHttpClientFactory httpClientFactory)
{
    private readonly HttpClient _httpClient = httpClientFactory.CreateClient("ApiClient");
}

方法3:强类型配置绑定(规范方案)

定义强类型配置类,将配置绑定到类实例,提升代码可读性和可维护性:

// 定义配置类
public class ApiSettings
{
    public string Path { get; set; } = string.Empty;
}

在Program.cs中绑定并注册:

// 绑定配置到强类型类
builder.Services.Configure<ApiSettings>(builder.Configuration.GetSection("API"));

// 注册HttpClient时通过IOptions获取配置
builder.Services.AddSingleton(sp =>
{
    var apiSettings = sp.GetRequiredService<IOptions<ApiSettings>>().Value;
    if (string.IsNullOrEmpty(apiSettings.Path))
        throw new InvalidOperationException("API:Path配置项未设置");
    return new HttpClient { BaseAddress = new Uri(apiSettings.Path) };
});

必要排查步骤

  • 确认appsettings.json的复制到输出目录属性设置为「始终复制」或「如果较新则复制」
  • 检查运行环境,若使用非Development环境,需确保对应appsettings.{Environment}.json文件存在且包含API:Path配置
  • 验证配置键名大小写是否完全匹配(JSON配置键区分大小写)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:29:49