我正在尝试设置 SignalR,但在添加消息时不断收到以下错误:
"Cannot perform runtime binding on a null reference"
我的客户端代码如下所示:
commentHub.addMessage = function (message) {
$('#divMessages').append(message);
};
我的服务器端代码如下所示:
public void Send(string message)
{
Clients.addMessage(message);
}
我首先打开一个客户端代码所在的窗口,然后打开一个新页面,该页面从代码隐藏中调用 Send 方法。为了测试它,我只需调用 send 方法,如下所示:
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
new TestHub().Send("Test");
}
我首先认为错误来自页面周期中错误位置的调用,因此我将其从 OnInit 移至 PreRender,但我仍然收到错误。现在我想知道是否必须从客户端执行发送命令才能更新它?
最佳答案
如果我理解正确的话,您想从服务器调用客户端方法。问题是服务器是一个集线器,基本上只是一种服务。您可以尝试按照@sinanakyazici 的建议进行操作,但这不是典型的交互。
如果您的目标是向已连接的客户端通知某些服务器事件,那么您可以按照此处的文档 ( https://github.com/SignalR/SignalR/wiki/Hubs ) 进行操作,最后一节名为“从集线器外部通过集线器进行广播”
。请注意,在页面生命周期中,当页面刷新时,用户未连接到中心。只有在页面加载并调用 javascript $.connection.start()
方法后,用户才会连接。即使您通过中心发送消息,导致页面刷新的用户也不会收到该消息。也就是说,有时您想要从代码隐藏向其他用户发送消息,这可以通过遵循 wiki 来完成,如下所示:
using SignalR.Infrastructure;
IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();
// invoke javascript method for all connected clients
clients.addMessage("Your message here");
对于您的具体要求,听起来您希望调用者获得有关某些长时间运行的任务的状态的反馈。您通常会在此处从客户端调用集线器,然后集线器将报告进度报告,直到完成,此时它可以触发已完成的回调。通常,这是使用以下方法完成的:
public void SomeTask(string message)
{
dowork();
// send message only to the invoker
Caller.addMessage("50% complete");
domorework();
// send message only to the invoker
Caller.addMessage("100% complete");
// fire processComplete javascript function
Caller.processComplete();
}
关于asp.net - SignalR 和 "Cannot perform runtime binding on a null reference",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9663318/