【问题标题】:Retrieving SignalR connectionId on Web API calls在 Web API 调用上检索 SignalR connectionId
【发布时间】:2019-09-08 10:49:55
【问题描述】:

我有以下星座:

我正在使用一个 asp.net 核心 web api 项目,该项目还包括一个 HubContext。用户要做的第一件事就是对我的UsersController : BaseController 进行 api 调用。在这里,他/她调用api/login 路由传递相应的凭据。 Login() 函数的返回值是一个 JwtBearerToken,从那时起用户将其用于所有其他 api 调用。

颁发令牌后,用户(客户端)通过我的ConnectionHub : Hub 建立 SignalR 连接。

到目前为止一切正常,用户在调用 api 方法时使用令牌进行身份验证,我还可以在我的ConnectionHub 范围内跟踪相应的会话状态。

现在我必须在他/她进行 api 调用时检索用户 (SignalR) 会话 ID。

我。 e.当用户在我的UsersController 中调用一个方法时,我想做这样的事情:


[HttpGet]
public ActionResult<List<User>> GetAll()
{
    // Here I want to retrieve the (SignalR) session id of the user calling this method.
    return Ok( userRepository.GetAllUsers() );
}

到目前为止,我唯一的想法是让用户使用相应的 api 调用发送他的 SignalR-SessionId,但我想要实现的是在服务器端读取 Id。我怎样才能做到这一点?

【问题讨论】:

  • REST 的工作方式与 signalR 或套接字之间存在根本区别,我建议您对此进行一些阅读并重新考虑您的要求。

标签: c# asp.net-core asp.net-core-webapi asp.net-core-signalr


【解决方案1】:

根据 Microsoft documentation,无法在集线器之外(例如在控制器中)获取用户的 connectionId

当从 Hub 类外部调用 hub 方法时,没有调用者与调用关联。因此,无法访问 ConnectionIdCallerOthers 属性。


但是,您可以通过调用集线器方法使用 JavaScript 获取用户。在这里,您可以使用您的存储库访问connectionId 和数据库(确保它可以通过依赖注入获得)。

我不知道你到底想对用户做什么,但你可以简单地在 hub 方法中返回用户并使用connectionId 做一些事情。

YourHubClass.cs

public Task GetAllUsers()
{
    // Get the ConnectionId
    var connectionId = Context.ConnectionId;

    // Get the users list
    var users = userRepository.GetAllUsers(); 

    // ...

    return Clients.User(user).SendAsync("UserListRequested", users);
}

【讨论】:

  • 基本上我想知道哪个会话负责/负责 api 调用。在我的场景中,单个用户可以打开多个会话,因此我必须知道用户在哪个会话中进行了某个 api 调用。
  • 我建议调用集线器方法(如上所述),因为您无法在控制器中获取 connectionId。正如@Aarif 对您的问题所评论的那样,REST 和 Websockets 之间存在差异。获取connectionId 的唯一方法是使用 HubContext。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多