SignalR和“无法对空引用执行运行时绑定”

时间:2012-03-12 07:43:57

标签: asp.net signalr

我正在尝试设置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命令才能更新它?

3 个答案:

答案 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");
});