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
相关产品推荐
相关产品推荐

