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

Blazor使用GetFromJsonAsync读取wwwroot JSON文件时请求URI无效

问题原因:Blazor Server与WebAssembly的运行模型差异

Blazor Server和WebAssembly的组件运行环境完全不同,这是导致相对路径失效的核心原因:

  • Blazor Server:组件代码运行在服务器端,你使用的Http实例是服务器端的HttpClient,而非浏览器的Fetch API。当直接传入相对路径"sample-data/weather.json"时,服务器端的HttpClient没有默认的基础请求地址,无法解析这个不完整的URI,因此抛出"An invalid request URI was provided"错误。
  • Blazor WebAssembly:组件代码运行在浏览器客户端,Http实例基于浏览器环境,相对路径会自动以当前页面的基础URL(比如http://localhost:5000)为前缀拼接成完整请求地址,所以能正常工作。
正确的解决方法

方法1:配置HttpClient的基础地址

在Program.cs中注册HttpClient时,指定基础地址为应用的根URL,这样就能直接使用相对路径:

builder.Services.AddScoped(sp => 
    new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

配置完成后,原代码await Http.GetFromJsonAsync<WeatherForecast[]>("sample-data/weather.json")即可正常运行,HttpClient会自动拼接基础地址生成完整请求URL。

方法2:直接读取服务器本地文件(更高效)

因为文件存储在服务器的wwwroot目录下,没必要走HTTP请求,直接通过IWebHostEnvironment读取本地文件性能更好:

private readonly IWebHostEnvironment _env;

// 通过构造函数注入IWebHostEnvironment
public YourComponent(IWebHostEnvironment env)
{
    _env = env;
}

private async Task LoadForecasts()
{
    var filePath = Path.Combine(_env.WebRootPath, "sample-data", "weather.json");
    var jsonContent = await File.ReadAllTextAsync(filePath);
    forecasts = JsonSerializer.Deserialize<WeatherForecast[]>(jsonContent);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:05:23