[英]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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.