Avalonia 12 WebAssembly版StorageProvider选择本地文件时崩溃
解决Avalonia 12 WASM版本地文件访问的
net_uri_notabsolute错误 问题根源
浏览器沙箱机制限制了WebAssembly程序直接访问本地文件的真实路径,Avalonia的StorageProvider在WASM环境下返回的IStorageFile.Path是浏览器内部的虚拟URI,并非本地磁盘的绝对路径,因此调用AbsolutePath会抛出net_uri_notabsolute错误。
解决方案
不要直接通过文件路径读写,改用IStorageFile提供的流操作方法来处理文件内容,这是WASM环境下访问本地文件的标准方式。
修改后的代码示例
调整OpenModel方法,改用流读取文件
private async Task OpenModel(CancellationToken token) { try { var filesService = App.Current?.Services?.GetService<IFilesService>(); if (filesService is null) throw new NullReferenceException("Missing File Service instance."); var file = await filesService.OpenModelAsync(); if (file is null) return; // 改用流读取文件内容,而非直接获取路径 using var stream = await file.OpenReadAsync(token); // 示例:读取XML内容 var xmlDoc = await XDocument.LoadAsync(stream, LoadOptions.None, token); // 后续处理xmlDoc... } catch (Exception ex) { // 异常处理逻辑 } }
OpenModelAsync方法无需修改,保持原逻辑即可
public async Task<IStorageFile?> OpenModelAsync() { var toplevel = TopLevel.GetTopLevel(_targetU); var files = await toplevel.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions() { Title = "Open Model File", FileTypeFilter = [FilePickerFileTypes.Xml], AllowMultiple = false }); return files.Count >= 1 ? files[0] : null; }
关键说明
- WASM运行在浏览器沙箱中,无法直接访问本地文件系统的真实路径,所有文件操作必须通过浏览器提供的File API(Avalonia已封装为
IStorageFile的流方法)完成。 - 桌面端可以正常使用
AbsolutePath是因为桌面环境没有沙箱限制,能直接访问本地文件系统。
内容的提问来源于stack exchange,提问作者Peter Jaksch
相关产品推荐
相关产品推荐

