我无法获取SignalR服务器端Hub代码来调用JS客户端方法。反过来工作正常 - 所以当我的客户端向服务器发送消息时,它按预期交付。我一直都非常小心避免明显的陷阱,但我想我仍然会忽略一些东西。这是我的代码:
来自MessageHub.cs:
public bool SendMessage( ClientMessage message )
{
...
Clients.All.addMessage("my message");
...
}
使用Javascript:
$.connection.hub.start()
.done(function () {
messageHub = $.connection.message;
// addMessage is never invoked.
messageHub.client.addMessage = function (message) {
alert('message added');
};
/* // I tried this based on some sample code but still not invoked.
messageHub.addMessage = function (message) {
alert('message added');
};
*/
// This works as expected.
messageHub.server.registerUser(userId);
...
});
如上所述,我找不到任何明显的设置缺陷,但这里有一些可能相关的要点:
所以,鉴于上述情况,我错过了一些明显的东西吗?如果不是,识别故障点的最佳方法是什么?
P.S。这与问题没有特别的关系,但是,由于某些原因,Fiddler不再从我的任何浏览器捕获任何流量,这使调试WS或HTTP流量有点挑战 - 我猜这是Windows 8的事情..
答案 0 :(得分:34)
所以,答案实际上非常简单(尽管自上次发布以来我已经从1.0.0.0-rc1升级到1.0.0.0 - 但我相当确定并没有明显改变这种情况)。
我在这里找到了答案:https://stackoverflow.com/a/15074002/32935(请注意,具体来说,我的解决方案是提供的第一个答案 - 尽管第二个答案帮助我找出原因)。
基本上,对于那些不想回答原始答案的人,我必须在针对连接调用start()
方法之前设置我的客户端方法,而不是在done()
回调中就像我一样。这是一个例子:
$.connection.message.client.addMessage = function (message) {
alert( 'Now it works!' );
};
$.connection.hub.start()
.done(function () {
console.log( 'Connection established!' );
});
答案 1 :(得分:-2)
当您将鼠标悬停在Clients对象上时,您是否看到了在JS中定义的所有函数?
无论如何,我不确定为什么你的方式不起作用,但这就是我写我的客户端的方式,并且它有效。也许你可以尝试这种方式。
$(function () {
var hub = $.connection.RatesHub;
$.connection.hub.start().done(function () {
/*Logic goes here*/
});
$.extend(hub.client, {
FuncName: function (msg) {
/*Logic goes here*/
}
});
}
要在服务器中识别的任何功能,请使用$ .extend。
希望有所帮助。