gpt4 book ai didi

asp.net-mvc - 从 MVC 中的 Controller 类获取客户端的 Connection Id

转载 作者:行者123 更新时间:2023-12-02 03:31:16 25 4
gpt4 key购买 nike

我正在使用 signalR 在 MVC 中构建聊天应用程序。我知道如何从集线器获取客户端的 ConnectionID。但是是否有可能从 Controller 获得相同的connectionID?

我尝试使用 HttpContext 和 OwinContext,但从几个属性中我找不到 ConnectionId 属性。甚至在 HttpContext 的 Request 属性中也不存在。

有人可以提供任何想法吗?

在这篇文章中_ How to obtain connection ID of signalR client on the server side?

_第一个答案建议您让 Hub 调用外部方法。

我知道我们保留一个字典的设计,该字典将每个 userId 映射到多个设备的多个 ConnectionId。

但是假设有一个 UserController,它具有登录和注销操作。如果我可以获得刚刚登录的用户的connectionId,那就更容易了。然后我只需从DbContext 中获取其userID 并将其存储到前面提到的Dictionary 中,供Hub 稍后使用。

最佳答案

您可以在客户端的 JavaScript 中使用 $.connection.hub.id 并在 SignalR hub ( see here ) 中使用 Context.connectionId 来获取用户的连接ID。

然后您可以用它做任何您想做的事情,您可以通过 AJAX 将其从客户端发布到 Controller ,或者从 SignalR 中心从服务器端发布到客户端。

如果您需要从 Controller 中检索尚未以某种形式( session 、数据库)保存的 SignalR 连接 ID - 这对我来说听起来像是代码味道。

您应该在 SignalR 中心内执行您需要执行的任何操作。无论是进行某些处理,还是将您的客户端 ID 发送到数据库以供 Controller 稍后使用。

如果问题是你想要执行的代码已经存在于你的 Controller 中并且你想要使用它并且你不希望它存在于两个地方,你应该将此代码移动到服务层(业务层) )并将其作为依赖项添加到您的 Controller 和 SignalR 中心。

就将连接 ID 映射到登录用户而言,只要您的用户已经登录,当您建立与 SignalR 集线器的连接时,这就会作为默认功能执行。

在中心内,您可以获取向您的中心进行调用的用户的 ID,并通过用户名或用户 ID 将消息返回给他们:

public MyHub : Hub
{
public void FirstMethod()
{
// Invoke method to the current caller to the hub
Clients.Client(connectionId).clientMethod();
}

public void SecondMethod()
{
// Get user id of the person making the call
var userId = this.User.Identity.GetUserId();

// Invoke method on the client side
Clients.User(userId).clientMethod();
}
}

关于asp.net-mvc - 从 MVC 中的 Controller 类获取客户端的 Connection Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33474008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com