Azure功能应用程序和SignalR

sso*_*nez 8 azure signalr azure-functions

我正在构建一个小型游戏,一方面使用SignalR,另一方面使用Azure功能应用程序.基本上,用户与服务器建立Web套接字连接并从中发送/接收消息.这主要是通过这种方式完成的,因为玩家可以实时互相讨论.

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

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

  • 每秒从客户端请求信息,然后警告用户是否需要.
  • 从我的功能应用程序中打开与我的Web套接字的连接以发送数据,并且集线器会将信息转发给受影响的用户.

第一种选择是打败了我的网络套接字的目的.如果我需要为服务器汇集一些信息,那么拥有Web套接字有什么意义呢.

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

也许有更好的选择?

Fei*_*Han 18

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

如果您想从Azure功能应用程序中调用hub方法向特定玩家广播怪物位置信息,您可以参考以下可以正常使用的示例.

Hub类

public class ChatHub : Hub
{       

    public void BroadcastMonstersPosition(string MonsterPositionInfo)
    {
        Clients.All.addNewMessageToPage(MonsterPositionInfo);
    }

    //other hub methods
}  
Run Code Online (Sandbox Code Playgroud)

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}");
}
Run Code Online (Sandbox Code Playgroud)

function.json

{
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 */1 * * * *"
    }
  ],
  "disabled": false
}
Run Code Online (Sandbox Code Playgroud)

project.json

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Microsoft.AspNet.SignalR.Client": "2.2.0"
      }
    }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

此外,如果您想要向特定玩家而不是所有连接玩家广播,您可以参考以下代码.

Clients.Clients(clientids_list).addNewMessageToPage(MonsterPositionInfo);
Run Code Online (Sandbox Code Playgroud)

  • 从功能连接到集线器时如何处理身份验证?由于函数写在答案中,似乎任何人都可以创建到任何集线器的连接并发布消息? (2认同)