【问题标题】:SignalR sending notification to a specific client it's not workingSignalR 向特定客户端发送通知它不起作用
【发布时间】:2021-03-11 07:27:46
【问题描述】:

当使用 SignalR 向特定用户发送通知时,它不起作用。

我将连接 ID 存储在一个表中,当应该发送通知时,我从数据库中获取了接收者的连接 ID,但他什么也没得到。我的代码有什么问题?

// get the connectionId of the receiver
if (_db.UserConnectionid != null)
{
    var userConn = await _db.UserConnectionid.Where(x => x.UserId == receiver).Select(x => x.ConnectionId).FirstOrDefaultAsync();

    //if the receiver is online
    if (userConn != null)
    {
        await Clients.Client(userConn).SendAsync("RecieveMessage", message);
    }
}

【问题讨论】:

  • 如果有UserId,可以直接试试Clients.User(receiver).SendAsync(...)
  • 这可能是由于多种不同的原因,数据库中陈旧的连接 ID 或者特别是在 SPA 的情况下,如果您在不同页面中创建了多个连接对象并且没有清理和关闭这些连接在离开页面之前。您发送的消息将始终由您首先创建的对象接收。这是我大部分麻烦的原因。

标签: entity-framework asp.net-core signalr signalr-hub


【解决方案1】:

我将连接 ID 存储在一个表中,当应该发送通知时,我从数据库中获取了接收者的连接 ID,但他什么也没得到。我的代码有什么问题?

首先,请注意,一个用户可能有多个连接ID,要解决此问题,您可以尝试调试代码并确保您从db检索到的连接ID与当前连接用户的连接ID相同。

此外,要向特定用户发送消息,您可以尝试获取特定用户/接收者的所有存储连接 ID,然后通过指定的连接 ID 发送消息,如下所示。

var ConnectionIds = _db.UserConnectionid.Where(x => x.UserId == receiver).Select(x => x.ConnectionId).ToList();

if (ConnectionIds.Count > 0)
{
    await Clients.Clients(ConnectionIds).SendAsync("RecieveMessage", message);
}

【讨论】:

    【解决方案2】:

    如果您使用默认用户声明机制进行授权,您可能可以查看此机制: https://docs.microsoft.com/en-us/aspnet/core/signalr/authn-and-authz?view=aspnetcore-5.0#use-claims-to-customize-identity-handling

    如果您将提供 IUserIdProvider 服务或将 userId 映射到 ClaimTypes.NameIdentifier 声明,您将能够使用此方法通过字符串化用户 ID 过滤您的 SignalR 客户端: https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.signalr.ihubclients-1.user?view=aspnetcore-5.0#Microsoft_AspNetCore_SignalR_IHubClients_1_User_System_String_

    像这样:

    await Clients.User(receiver.ToString()).SendAsync("RecieveMessage", message);
    

    【讨论】:

      【解决方案3】:

      按照文章中的建议,不要存储 ID。

      https://consultwithgriff.com/signalr-connection-ids/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-12
        • 1970-01-01
        • 2016-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多