.NET 8下MAUI LocalStorage失效,会话信息无法持久化求助
针对你升级到.NET 8后MAUI应用最小化会话丢失的问题,分享几个实际排查和解决的方向:
确认LocalStorage服务注册与调用时机
.NET 8对MAUI的Blazor集成有细节调整,检查Program.cs中是否正确注册了LocalStorage服务:builder.Services.AddBlazorWebView(); builder.Services.AddLocalStorageServices(); // 部分模板升级后可能遗漏这行注册同时避免在应用生命周期早期(如页面构造函数)调用LocalStorage,建议在
OnInitializedAsync这类异步生命周期方法中执行读取操作。处理应用后台生命周期事件
应用最小化进入后台时,部分平台会限制WebView相关的存储操作,建议主动在OnSleep事件中持久化会话数据,在OnResume时重新读取:protected override async void OnSleep() { base.OnSleep(); // 主动保存当前用户信息到LocalStorage if (CurrentUser != null) { await storage.SetItemAsync(LocalStorageKey.UserInfo, CurrentUser); } }同时检查
OnResume逻辑中是否存在误清空LocalStorage的代码。排查序列化/反序列化异常
.NET 8的System.Text.Json默认行为有变更,比如对私有构造函数、未标记属性的处理更严格。确保UserInfo类有无参公共构造函数,且所有需要序列化的属性都是公共可读写的;如果包含复杂类型属性,需添加[JsonInclude]标记或自定义转换器。
可以显式指定序列化选项来兼容旧数据:var userInfo = await storage.GetItemAsync<UserInfo>( LocalStorageKey.UserInfo, new JsonSerializerOptions { PropertyNameCaseInsensitive = true } );改用MAUI原生Preferences存储会话
LocalStorage本质是WebView的缓存机制,移动端持久化小数据推荐使用MAUI原生的Preferences,它的持久化可靠性更高,不受WebView缓存回收影响:// 保存用户信息 var userJson = JsonSerializer.Serialize(CurrentUser); Preferences.Set(LocalStorageKey.UserInfo, userJson); // 读取用户信息 var userJson = Preferences.Get(LocalStorageKey.UserInfo, null); if (!string.IsNullOrEmpty(userJson)) { CurrentUser = JsonSerializer.Deserialize<UserInfo>(userJson); }清理旧缓存数据
升级后旧的存储缓存可能与.NET 8的新格式冲突,先卸载应用、清除模拟器/真机的应用数据,再重新部署测试,排除缓存干扰。
内容的提问来源于stack exchange,提问作者FedericoLovera

