Blazor WebAssembly报错:找不到路径'/sample-data/DBFile.json'求助
Blazor WebAssembly 文件路径错误解决方案
错误原因
Blazor WebAssembly 运行在浏览器沙箱环境中,无法直接通过System.IO.File类访问本地文件系统。你代码里的System.IO.File.WriteAllText是针对桌面/服务器应用的API,在浏览器中执行时会因为没有文件系统权限和路径解析逻辑不匹配,抛出找不到路径的异常。
正确的文件读取方式
你使用HttpClient读取文件的思路是对的,这是Blazor WASM中读取静态资源的标准方式,但需要确保文件位置和路径配置正确:
- 将
DBFile.json放在项目的wwwroot/sample-data目录下(wwwroot是Blazor WASM的静态资源根目录,所有前端可访问的静态文件都要放在这里) - 确保
jsonPath的值为"sample-data/DBFile.json"(不需要加前缀/,HttpClient默认从网站根目录发起请求)
修正后的读取代码示例:
private readonly HttpClient _http; // 通过依赖注入获取HttpClient实例 public YourDataService(HttpClient http) { _http = http; } public async Task<List<MotoDTO>> LoadData() { var jsonPath = "sample-data/DBFile.json"; var response = await _http.GetAsync(jsonPath); if (response.IsSuccessStatusCode) { var content = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject<List<MotoDTO>>(content); } else { return new List<MotoDTO>(); } }
正确的数据保存方式
受浏览器沙箱限制,无法直接写入本地静态文件,推荐以下两种可行方案:
方案1:使用浏览器本地存储(LocalStorage)
通过IJSRuntime调用浏览器的LocalStorage API保存数据,数据会持久化存储在用户的浏览器中:
private readonly IJSRuntime _jsRuntime; // 通过依赖注入获取IJSRuntime实例 public YourDataService(IJSRuntime jsRuntime) { _jsRuntime = jsRuntime; } public async Task SaveData(List<object> list) { try { var output = System.Text.Json.JsonSerializer.Serialize(list); // 调用JS方法将数据存入LocalStorage await _jsRuntime.InvokeVoidAsync("localStorage.setItem", "appDbData", output); } catch (Exception ex) { var msg = ex.Message; // 这里可以添加异常日志或用户提示逻辑 } } // 对应从LocalStorage读取数据的方法 public async Task<List<MotoDTO>> LoadFromLocalStorage() { var json = await _jsRuntime.InvokeAsync<string>("localStorage.getItem", "appDbData"); if (!string.IsNullOrEmpty(json)) { return JsonConvert.DeserializeObject<List<MotoDTO>>(json); } return new List<MotoDTO>(); }
方案2:上传到后端服务器
如果需要将数据持久化存储到服务器,需要编写后端API接口接收数据,然后在Blazor中通过HttpClient上传:
private readonly HttpClient _http; public YourDataService(HttpClient http) { _http = http; } public async Task SaveToServer(List<object> list) { try { var output = System.Text.Json.JsonSerializer.Serialize(list); var content = new StringContent(output, Encoding.UTF8, "application/json"); // 调用后端API接口,替换为你的实际接口地址 var response = await _http.PostAsync("api/data/save", content); response.EnsureSuccessStatusCode(); } catch (Exception ex) { var msg = ex.Message; // 处理上传异常 } }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

