【问题标题】:Return websocket from signalR in ASP .NET 3.0从 ASP .NET 3.0 中的 signalR 返回 websocket
【发布时间】:2020-11-06 22:48:33
【问题描述】:

我正在尝试完成此任务以进行面试。任务如下:

创建 REST API。需要实现以下端点:

POST /登录 • 在 POST 中,有效负载将是用户名和密码,它返回 false 或 true 以及一些令牌

GET /排行榜/ • 返回某些游戏类型的虚拟数据GET

/匹配 • 返回活动匹配的虚拟列表POST

/匹配/加入 • 玩家将加入比赛并返回带有一些会话令牌WS的WebSocket连接 /match/room • 此端点仅适用于 WebSocket

• 将有 3 条消息:Fire (void)、Move (Vector3 Location)、GetPlayers (uint16 Limit)所有路由应仅返回虚拟数据,不需要数据库(但如果您有时间实现一些数据库)。请使用 .NET Core、C# 和。 ASP.NET 核心。 对于 WebSocket,请使用 SignalR

我无法了解如何使用 signalR 创建 websocket 以及如何获取其数据会话令牌。 谁能给我解释一下?

我能想到的就是创建一个这样的集线器:

 public class MatchHub: Hub
    {
        public async void Fire()
        {
           await Clients.All.SendAsync("Fire msg");
        }
        public async void Move (Vector3 Location)
        {
           await Clients.All.SendAsync("Move msg");
        }
        public async void GetPlayers (UInt16 Limit)
        {
           await Clients.All.SendAsync("GetPlayers msg");
        }
    }

但我不认为那是他们想要的。据我所知,这个集线器始终可用,并且不需要 Join 方法。

【问题讨论】:

  • SignalR 是对 WebSockets 的抽象,在必要时也会回退到较旧的传输,即您使用 SignalR,但未实现或直接使用 WebSockets 协议。
  • "我不知道如何使用 signalR 创建 websocket"... SignalR 会在您启动 SignalR 连接时自动为您创建一个 websocket(除非它不能出于任何原因,在这种情况下它将尝试使用不同的协议)。如果您花了 2 分钟时间阅读 SignalR 的任何基本介绍,您就会知道这一点。所以这个指令只是告诉你在你的 websocket 实现中使用 SignalR,而不是使用任何其他的 websockets 实现。因此,我会说您创建 SignalR 集线器的方法基本上没问题。 (对于“会话令牌”,只需使用连接 ID。)
  • Adyson,我花在阅读 SignalR 上的时间比你想象的要多(实际上是几个小时),而且我理解你所写的一切。这就是我创建这个问题的原因。我不确定我是否理解正确。并认为该任务要求我直接使用 websockets,而这实际上是 signalR 无法实现的。这只是我所知道的不安全感。
  • @Genna:那么您目前的问题/问题是什么?

标签: c# api asp.net-core websocket signalr


【解决方案1】:

@mm8:答案是你不能使用 signalR 从控制器打开 websocket(它在启动集线器配置上自行打开)。并且无法在任务中随心所欲地使用它。我认为我对集线器所做的事情毕竟是正确的。只是为了返回会话数据,我使用了 SignalR.Client 块,如下所示:

[HttpGet("match/join", Name = "JoinMatch")]
        public async Task<IActionResult> JoinMatch()
        {  
            var connection = new HubConnectionBuilder()
                .WithUrl("http://localhost:5000/match/room")
                .Build();

            await connection.StartAsync();
            await connection.SendAsync("Fire");

            return Ok(connection);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多