【问题标题】:How to use SignalR in an Azure function app?如何在 Azure 函数应用中使用 SignalR?
【发布时间】:2018-01-15 05:06:52
【问题描述】:

我正在构建一个由 Web 套接字驱动的小游戏,一方面使用 SignalR,另一方面使用 Azure 函数应用程序。基本上,用户与服务器建立 Web 套接字连接并从中发送/接收消息。这样做主要是因为玩家可以实时互相讨论。

此外,我想要一些运行和执行一些指令的 Azure 函数应用。例如,每分钟,一个应用程序都会让一些怪物移动。如果这些怪物在某个特定玩家周围,我希望他知道。

为此,我有两个解决方案:

  • 每秒向客户端请求信息,然后在用户需要时警告用户。
  • 从我的函数应用中打开到我的 Web 套接字的连接以发送数据,集线器会将信息转发给受影响的用户。

第一个选项对我来说破坏了网络套接字的目的。如果我需要轮询服务器以获取某些信息,那么使用 Web 套接字有什么意义。

第二个选项似乎更好,但由于我还不熟悉功能应用程序,我想知道这是否是要走的路。从功能应用程序打开 Web 套接字连接是否可能/正确?

也许有更好的选择?

【问题讨论】:

    标签: azure signalr azure-functions


    【解决方案1】:

    例如,每分钟,一个应用程序都会让一些怪物移动。如果这些怪物在某个特定玩家周围,我希望他知道。

    如果你想从你的 Azure Functions 应用中调用 hub 方法来向特定玩家广播怪物的位置信息,你可以参考以下在我这边工作正常的示例。

    中心类

    public class ChatHub : Hub
    {       
    
        public void BroadcastMonstersPosition(string MonsterPositionInfo)
        {
            Clients.All.addNewMessageToPage(MonsterPositionInfo);
        }
    
        //other hub methods
    }  
    

    Azure Functions 应用(timerTrigger)

    using System;
    
    
    public static void Run(TimerInfo myTimer, TraceWriter log)
    {
        var hub = new Microsoft.AspNet.SignalR.Client.HubConnection("http://xxxxxx.azurewebsites.net/signalr/hubs");
    
        var proxy = hub.CreateHubProxy("ChatHub");
        hub.Start().Wait();
    
        //invoke hub method
        proxy.Invoke("BroadcastMonstersPosition", "new position info");
        log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
    }
    

    function.json

    {
      "bindings": [
        {
          "name": "myTimer",
          "type": "timerTrigger",
          "direction": "in",
          "schedule": "0 */1 * * * *"
        }
      ],
      "disabled": false
    }
    

    project.json

    {
      "frameworks": {
        "net46":{
          "dependencies": {
            "Microsoft.AspNet.SignalR.Client": "2.2.0"
          }
        }
       }
    }
    

    客户端用户可以接收 Azure Functions 应用发送的消息

    另外,如果你想广播给特定玩家而不是所有连接的玩家,你可以参考下面的代码。

    Clients.Clients(clientids_list).addNewMessageToPage(MonsterPositionInfo);
    

    【讨论】:

    • 好吧好吧,看来这完全是我需要的!非常感谢 ;-)
    • 从 Function 连接到 Hub 时如何处理身份验证?正如答案中所写的那样,似乎任何人都可以创建与任何集线器的连接并发布消息?
    • 我不太明白它是如何工作的。我收到一个错误 Unable to establish connection for hub.Start().Wait(); 我正在为我的 azure signalR 服务使用 https 版本
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多