2012-03-12 34 views
2

我想设置SignalR了,但我一直添加邮件时收到以下错误:SignalR和“无法执行运行时对空引用结合”

“不能执行运行时对空引用结合“

我的客户方代码如下所示:

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

我的服务器端的代码如下所示:

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

我首先打开一个窗口,其中客户端代码位于,然后打开一个新页面,从代码隐藏中调用Send方法。为了测试它,我简单地调用这样的发送方法:

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

我首先想到的是从在页面周期错误的地方有电话进来的错误,所以我把它从OnInit的要预渲染的,但我仍然收到错误。现在我想知道是否必须执行客户端发送命令来更新它?

+0

如何从代码隐藏中调用发送方法?你能表演吗? – sinanakyazici 2012-03-12 10:09:16

+0

我已经更新了这个问题。 – Dofs 2012-03-12 11:55:37

回答

3

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

如果您的目标是通知某些服务器事件的连接的客户端,那么您可以按照此处的文档(https://github.com/SignalR/SignalR/wiki/Hubs)在最后一节中称为"Broadcasting over a Hub from outside of a Hub"。请注意,在页面生命周期中,用户NOT在页面刷新时连接到集线器。只有在页面加载后,才会调用用户连接的javascript $.connection.start()方法。即使您要通过集线器发送邮件,导致页面刷新的用户也不会收到该邮件。这就是说有的时候要按照维基背后发送从代码的消息给其他用户,可以提到来完成,看起来像:

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(); 
} 
+0

非常感谢@ Gary.S现在可以工作。我正在寻找类似于您的示例中连接管理器的东西。我不知道我是否在文档中错过了它,或者它是否隐藏在wiki上。 – Dofs 2012-03-13 08:18:40

+1

@Dofs很高兴我能够提供帮助。它有点隐藏(在提供的链接中,非常最后一节)。 – 2012-03-13 08:20:05

0

事情是我很确定SignalR需要启动,所以自己创建中心实例会缺少很多初始化代码,这些代码将会正常完成(比如绑定客户端动态对象等)一种方法做什么是在$ .connection.start做在客户端启动,否则我就从客户端调用此:

Client.js

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

问题是我要将它与后端任务一起使用,所以如果可以避免,我不想从客户端调用它。 – Dofs 2012-03-12 13:08:02

1

您应该安装Newtonsoft.Json的NuGet。然后,

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

你可以这样做。

相关问题