【问题标题】:SignalR does not invoke server hub method when calling function outside of .done调用 .done 之外的函数时,SignalR 不会调用服务器集线器方法
【发布时间】:2017-11-27 19:07:52
【问题描述】:

我一直在尝试在我的游戏中实现 signalR,以处理实时更新玩家位置,并将其广播到所有连接的客户端。

但是,调用服务器集线器方法的客户端函数永远不会到达服务器,除非我在 $.connection.hub.start().done() 之后直接调用它。举个例子吧……

这会正确调用服务器集线器方法UpdatePlayerPosition,但我不想直接在.done 上调用此方法:

$.connection.hub.start().done(function () {
    $.connection.playerHub.server.updatePlayerPosition(playerObj)
});

但是,如果我在我的主 gameEngine 对象上创建一个变量并稍后调用它,即每次玩家移动时,什么都不会发生。

$.connection.hub.start().done(function () {
        gameEngine.updatePlayerPosition = function () {
            $.connection.playerHub.server.updatePlayerPosition(playerObj) 
            //playerObj is a global variable
        }
});

if (player.isMoving) {
   gameEngine.updatePlayerPosition();
}

调用 gameEngine.updatePlayerPosition() 确实命中了正确的函数,并遍历了所有 signalr.js,但没有命中服务器上的断点。

这里是集线器代码(我还没有在集线器上添加更新播放器的功能,我只是想先进行通信)

using Microsoft.AspNet.SignalR;
using RPGGameCS.Models.Player;

namespace RPGGameCS
{
    public class PlayerHub : Hub
    {
        public void UpdatePlayerPosition(IPlayer player)
        {
            Clients.All.updatePlayerPosition(player);
        }
    }

}

我见过的所有 signalR 示例都将这些服务器调用绑定到点击事件,我不想这样做。看起来这应该是可能的,但到目前为止我所尝试的都没有奏效。有什么我做错了吗?或者也许无法以这种方式委派 singalR 函数?

编辑 1***:所以它似乎与我发送到集线器方法的播放器对象有关。当我将播放器对象设为空时,通信似乎工作正常。但是当我发送实际的玩家对象时,断点永远不会被击中。

【问题讨论】:

    标签: javascript c# asp.net signalr


    【解决方案1】:

    方法签名必须匹配。

    在您的集线器中,您有一个参数 IPlayer,而在客户端,您没有设置此参数。 gameEngine.updatePlayerPosition();public void UpdatePlayerPosition(IPlayer player) 不匹配

    如果您调用例如 gameEngine.updatePlayerPosition(); signalr 根据名称和参数在连接的集线器上搜索方法。如果它找不到方法,我认为您应该在日志中找到它。

    启用测试日志:

    $.connection.hub.logging = true;
    $.connection.hub.start();
    

    (https://docs.microsoft.com/en-us/aspnet/signalr/overview/testing-and-debugging/enabling-signalr-tracing)

    【讨论】:

    • 谢谢!!不知道我是怎么错过的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2015-05-06
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多