信号和"Cannot perform runtime binding on a null reference"



我正在尝试设置SignalR,但在添加消息时一直收到以下错误:

"无法对空引用执行运行时绑定"

我的ClientSide代码如下:

commentHub.addMessage = function (message) {
    $('#divMessages').append(message);
};

我的服务器端代码如下:

public void Send(string message)
{
     Clients.addMessage(message);
}

我首先打开客户端代码所在的一个窗口,然后打开一个新页面,该页面从codeehind调用Send方法。为了测试它,我简单地调用send方法,如下所示:

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);
    new TestHub().Send("Test");
}

我最初认为错误来自页面周期中错误位置的调用,所以我将其从OnInit移到了PreRender,但我仍然收到了错误。现在我想知道是否必须从客户端执行Send命令才能更新它?

如果我理解正确,您希望从服务器调用客户端方法。问题是服务器是一个集线器,它基本上只是一个服务。你可以试着按照@sinakakazici的建议去做,但这不是一个典型的互动。

如果你的目标是通知连接的客户端一些服务器事件,那么你可以按照这里的文档(https://github.com/SignalR/SignalR/wiki/Hubs),在最后一个称为"Broadcasting over a Hub from outside of a Hub"的部分中。请注意,在页面生命周期中,当页面刷新时,用户NOT连接到集线器。只有在页面加载并调用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();
}

您应该从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");
    }

你可以这样做。

问题是,我很确定SignalR需要启动,所以自己创建集线器实例将丢失许多正常完成的初始化代码(如绑定Clients动态对象等)。要么找到一种方法来完成在客户端启动的$.connection.start中所做的事情,要么我从客户端调用它:

Client.js

$.connection.start(function() {
  $.connection.testHub.Send("test");
});

相关内容

最新更新