繁体   English   中英

SignalR Blazor WebAssembly 的通知

[英]SignalR notifications for Blazor WebAssembly

我有 Blazor WebAssembly 客户端应用程序和带有 Microsoft Identity 的 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); 
               });
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM