簡體   English   中英

在.done之外調用函數時,SignalR不調用服務器中心方法

[英]SignalR does not invoke server hub method when calling function outside of .done

我一直在嘗試在我的游戲中實現signalR以實時更新玩家位置,並將其廣播給所有連接的客戶端。

但是,除非調用$ .connection.hub.start()。done()之后直接調用它,否則調用服務器中心方法的客戶端函數永遠不會到達服務器。 讓我給你舉個例子...

這會正確調用服務器中心方法UpdatePlayerPosition,但我不想直接在.done上調用此方法:

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

但是,如果我在主gameEngine對象上創建一個變量,並在以后每次調用IE時調用它,即IE,則不會發生任何事情。

$.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的所有示例都將這些服務器調用綁定到click事件,而我不想這樣做。 似乎這應該可行,但是到目前為止我沒有嘗試過。 我做錯了什么嗎? 還是不可能以這種方式委派singalR函數?

編輯1 ***:看來這與我發送給hub方法的播放器對象有關。 當我將播放器對象設置為空時,通信似乎可以正常工作。 但是,當我發送實際的玩家對象時,決不會碰到斷點。

方法簽名必須匹配。

在集線器中,您有一個參數IPlayer,而在客戶端上,您沒有設置此參數。 gameEngine.updatePlayerPosition(); public void UpdatePlayerPosition(IPlayer player)不匹配

如果您調用例如gameEngine.updatePlayerPosition(); signalr根據名稱和參數在連接的集線器上搜索方法。 在這種情況下,它找不到方法,我認為您應該在日志中找到它。

啟用日志進行測試:

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

https://docs.microsoft.com/zh-cn/aspnet/signalr/overview/testing-and-debugging/enabling-signalr-tracing

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM