c# - Blazor WebAssembly 的 SignalR 通知
问题描述
我有 Blazor WebAssembly 客户端应用程序和带有 Microsoft 标识的 ASPCore WebAPI,我想从服务器向特定用户发送通知。
我对如何实现这一点的第一个想法是发送这样的通知:
public async System.Threading.Tasks.Task SendPushNotification(ClaimsPrincipal user, string someNotificationMessage)
{
string userGuid = user.FindFirst(ClaimTypes.NameIdentifier).Value;
await _hubContext.Clients.All.SendAsync("notification", userGuid, someNotificationMessage);
}
在客户端检查身份上,但我什至还没有弄清楚如何在 blazor 客户端上获得身份。?
但我认为肯定有更好的方法。请问,你能告诉我如何向特定用户发送通知吗?
解决方案
SignalR 内置了对从指定客户端调用方法的支持。因此,默认情况下,它依赖于 ClaimTypes.NameIdentifier 类型的 Claim 来区分不同的用户。
await _hubContext.Clients.User(userGuid).SendAsync("notification", someNotificationMessage);
要使其正常工作,您必须在从 Blazor 客户端组件建立 HubConnection 时将用户的 JWT 令牌传递给集线器。
必须将以下服务注入 Razor 组件:
@inject NavigationManager navigationManager
@inject IAccessTokenProvider tokenProvider
@code 部分中的 OnInitializedAsync 方法的主体可能看起来像这样:
if (((await AuthState).User).Identity.IsAuthenticated)
{
AccessToken token = new AccessToken();
(await tokenProvider.RequestAccessToken()).TryGetToken(out token);
if (token is not null)
{
hubConnection = new HubConnectionBuilder()
.WithUrl(NavigationManager.ToAbsoluteUri("/{hubName}"), options =>
{
options.AccessTokenProvider = async () => token.Value;
})
.Build();
await hubConnection.StartAsync();
hubConnection.On<string>("notification", message =>
{
snackBar.Add(message, Severity.Info);
});
}
}
推荐阅读
- airflow - 无法使用气流插件运行气流任务
- javascript - React Typeahead 异步 API
- python - 使用函数创建具有一个未知数的向量
- azure-devops - 创建可以从另一个阶段或手动调用的阶段?
- python - 在 spacy 中自定义 Tokenizer
- python - 在 Jupyter Notebook 中显示多个 HTML 内容(循环中的 IFrame)
- python - 在 Tkinter 中使用“root.attributes('-type', 'splash')”的问题
- android - 底页没有完全隐藏android?
- apache-kafka - 卡夫卡无法启动。收到以下错误
- javascript - 如何在reactjs中制作点击按钮然后打开url