我正在尝试设置SignalR,但在添加消息时我不断收到以下错误:
“无法对空引用执行运行时绑定”
我的ClientSide代码如下所示:
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,但我仍然收到错误。现在我想知道是否必须从客户端执行Send命令才能更新它?
答案 0 :(得分:3)
如果我理解正确,您想从服务器调用客户端方法。问题是服务器是一个基本上只是服务的集线器。您可以尝试按照@sinanakyazici的建议,但这不是典型的互动。
如果您的目标是通知已连接的客户端某些服务器事件,那么您可以在最后一节"Broadcasting over a Hub from outside of a Hub"
中按照此处的文档(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();
}
答案 1 :(得分:1)
您应该从Nuget安装Newtonsoft.Json。然后,
protected void Button_OnClick(object sender, EventArgs e)
{
//{0} = your hub class name with namespace. Example: SignalR.TestHub
//{1} = your host address. Example : http://localhost:1234
HubConnection hubConnection = new HubConnection("{1}");
IHubProxy hub= hubConnection.CreateProxy("{0}");
hubConnection.Start().Wait();
hub.Invoke("Send","message");
}
你可以这样做。
答案 2 :(得分:0)
问题是我非常确定SignalR需要启动,因此自己创建集线器实例会遗漏许多正常化的初始化代码(比如绑定客户端动态对象等)。在客户端启动时在$ .connection.start中执行的操作的方法,或者我将从客户端调用此方法:
Client.js
$.connection.start(function() {
$.connection.testHub.Send("test");
});