在Blazor与Microsoft Identity库中实现用户删除个人数据的DeleteAccount()方法遇到问题
兄弟我太懂这种抓瞎的感觉了!网上搜出来的代码各说各的,本来只是想整个删账号的小功能,结果折腾得心力交瘁,完全能共情你现在的崩溃😂
先理理你的处境:你是个业余开发者,用Blazor、C#和SQL搭了个玩的Web应用,平时都是用InteractiveServer模式跑的,但到了/DeletePersonalData页面就因为某个调用直接退成静态模式了,找遍网上的解决方案,每个人的代码都不一样,越看越乱,现在完全不知道该咋推进了。
给你几个我自己踩坑后总结的实际解决方向,绝对接地气:
先揪出页面回退静态的元凶
大概率是你的DeleteAccount()方法里用了Blazor Server模式不兼容的东西!比如直接操作HttpContext,或者写了同步的数据库操作阻塞了上下文。先去浏览器控制台看报错,或者翻Blazor的应用日志,回退静态一般都会有明确的错误提示,找到这个就解决了一半问题。别自己造轮子,用Identity原生方法删用户
Microsoft Identity本身就有现成的删用户方法,别瞎写复杂逻辑,给你个能用的示例:private async Task DeleteAccount() { // 先拿到当前登录的用户 var currentUser = await _userManager.GetUserAsync(User); if (currentUser == null) { ErrorMessage = "未找到当前用户"; return; } // 重点:先删用户的关联数据! // 比如你数据库里和用户绑定的个人设置、发布的内容这些,得先清掉 // 举个例子:_appDbContext.UserProfiles.RemoveRange(currentUser.UserProfile); // await _appDbContext.SaveChangesAsync(); // 再调用Identity的原生删除方法 var deleteResult = await _userManager.DeleteAsync(currentUser); if (deleteResult.Succeeded) { // 删完立刻登出,跳转到首页 await _signInManager.SignOutAsync(); _navigationManager.NavigateTo("/", forceLoad: true); } else { // 把错误信息拼起来给用户看 ErrorMessage = string.Join("; ", deleteResult.Errors.Select(e => e.Description)); } }强制页面用InteractiveServer模式
如果你确定方法里的代码没问题,就在DeletePersonalData页面的最顶部加一行:@rendermode InteractiveServer这样就不会随便回退到静态模式了,但前提是你的方法里真的没有违反Blazor Server规则的代码哦。
别用同步操作!全改成异步
Blazor Server里同步操作很容易阻塞上下文,导致模式回退。所有数据库操作、Identity的方法都要加await,比如await _userManager.GetUserAsync(User),绝对不能写_userManager.GetUser(User)这种同步调用。
我之前做Blazor项目的时候也踩过一模一样的坑,一开始搜出来的代码要么是老版本Blazor的,要么是别人自己瞎改的,后来才发现就是个同步操作的小问题,改完就正常了,你按这个思路排查肯定能搞定!
备注:内容来源于stack exchange,提问作者baswijdenesdotcom

