在这里,我试图使用blzor服务器应用程序中的登录用户UserIdentifier
,为同一登录用户刷新在同一浏览器或不同浏览器的多个窗口打开的所有相同页面上的数据。
但问题是,数据只在一个窗口中刷新,而不是在同一登录用户的所有窗口中刷新。
我的想法是:如果我向SignalR
集线器await Clients.Users(useridentifier).SendAsync("testrec", useridentifier);
提供用户标识符,它将在该用户标识符的所有登录窗口中刷新该用户的数据。
以下是我的代码
public async Task deleteSentRequest()
{
mainService.DeleteRequest(friend.FriendRequestSenderName, friend.FriendRequestReceiverName);
await OnDeletionRequest.InvokeAsync(chattingUserEmail);
}
<DisplayFriendRequest OnDeletionRequest="RequestDeletionEventHandler" friend="item" chattingUserEmail="@ChattingUserEmail" ></DisplayFriendRequest>
下面是我的EventHandler
public async Task RequestDeletionEventHandler(string chattingUserEmail)
{
var getUserIdentifier = mainService.GetUserIdentifier(chattingUserEmail);
await hubConnection.SendAsync("RefreshUser", getUserIdentifier);
}
下面是我的集线器
[Authorize]
public class Chat:Hub
{
public async Task RefreshUser(string useridentifier)
{
await Clients.Users(useridentifier).SendAsync("Receive", useridentifier);
}
}
hubConnection.On<string>("Receive", Reloaduser);
public void Reloaduser(string userIdentifier)
{
var chattingUserEmail = mainService.GetUserEmailByUserIdentifier(userIdentifier);
friendRequestList = mainService.GetAllFriendRequest(chattingUserEmail);
FriendRequestCount = friendRequestList.Count();
}
您就快到了!问题是,您并没有循环通过每个用户连接,只是第一个匹配的用户连接。您需要将RefreshUser
代码更新为这样的代码(我在这里对您如何编写应用程序进行了巨大的假设(:
[Authorize]
public class Chat:Hub
{
public async Task RefreshUser(string useridentifier)
{
foreach(var user in Clients.Users.Where(x => x.Email == useridentifier))
{
await user.SendAsync("Receive", useridentifier);
}
}
}