2012-03-12 35 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"); 
    } 

你可以這樣做。

相關問題