【问题标题】:SignalR notifications for Blazor WebAssemblyBlazor WebAssembly 的 SignalR 通知
【发布时间】:2021-11-20 10:44:19
【问题描述】:

我有 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 客户端上获取身份。?

但我认为肯定有更好的方法。请告诉我如何向特定用户发送通知?

【问题讨论】:

    标签: c# asp.net-core signalr blazor-webassembly


    【解决方案1】:

    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); 
                   });
        }
    }
    

    【讨论】:

    • 但这对我不起作用。我的客户端上有这段代码:`private async Task StartNotificationHub()` { _notificationHubConnection = new HubConnectionBuilder().WithUrl(NavigationManager.ToAbsoluteUri("/notificationhub")) .Build(); _notificationHubConnection.On("notification", message => {snackBar.Add(message, Severity.Info); });等待 _notificationHubConnection.StartAsync(); }` 并尝试在您发布时发送消息。
    • 谢谢,但还是不行,AuthState.User.Identity.IsAuthenticated 是真的,但我没有看到任何其他用户信息。例如,名称和声明为空。
    猜你喜欢
    • 2021-06-15
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多