2012-11-02 52 views
4

我發現的SignalR的大部分示例都假設爲ASP.NET(不包括MVC)。我正在使用NancyFX。我只有一個問題,所以我希望有一些我可以忽略的東西,或者我需要在南希做一些事情來補償不是ASP.NET。如何使用ASP.NET託管在Nancy與SignalR通信服務器到客戶端?

我的一個目標是在服務器事件發生時能夠通知客戶端瀏覽器。我不打算用hub方法替換我的Nancy路線。但我希望能夠從我的路由(動作)調用瀏覽器。

我有一個非常簡單的Hub,我按照SignalR Wiki中的示例創建。我甚至不知道我需要它,因爲我不打算將客戶端調用到服務器。

public interface IUserNotifier 
{ 
    void Start(); 
    void Notify(object @event); 
} 

我,希望我將能夠注入相同的輪轂後來在我的南希航線使用使用的接口...我不知道那是在打牌。

[HubName("userNotifier")] 
public class UserNotifier : Hub, IUserNotifier 
{   
    public void Start() 
    { 
     Notify(new {Status = "Started"}); 
    } 

    public void Notify(object @event) 
    { 
     Clients.notification(@event); 
    } 
} 

當我在HTML文件中有下面的代碼,我可以看到,它執行Start()方法,然後Notify()方法,將內容傳送到我的客戶。

var communicator = $.connection.userNotifier; 

$.extend(communicator, { 
    Notification: function(event) { 
     alert("notification received from server!"); 
     console.log(event); 
    } 
}); 

$.connection.hub.start() 
    .done(function() { 
     communicator.start(); 
}); 

就像我說的,「啓動」集線器工作併發送通知給客戶端。很酷。但是,那麼我的主要目標還沒有完成。我需要從我的代碼中的其他地方發起這些通知,這些通知可能不會與「請求」直接關聯。

我試圖注入我的IUserNotifier在我南希模塊的線路使用,但是當Notify()被解僱了,我得到:

Cannot perform runtime binding on a null reference

這是因爲Clients財產上的Hub基類爲空(尚未初始化)。所以,我換了齒輪。我試圖按照多個例子,包括在所謂的「廣播在集線器從樞紐外」一節中的wiki page about hubs的例子:

public class NotifierModule : NancyModule 
{ 
    public NotifierModule(){ 

     Get["/notify/{message}"] = p => { 
      var context = GlobalHost.ConnectionManager.GetHubContext<UserNotifier>(); 
      context.Clients.notification(new { Message = p.message }); 
     }; 
    } 
} 

我南希路線的執行沒有引發錯誤。除了我的瀏覽器從未收到消息。如果我在路由中設置了斷點,則可以看到Clients已初始化。也許客戶端的集合被初始化,但是是空的。誰知道?也許你會。 :)

同樣,我的主要目標是能夠隨時從代碼中的任何位置向瀏覽器發送事件/通知。那是過分的要求?我應該在這裏做什麼?

回答

2

我相信你一定已經找到了答案。但是,我想我可以嘗試並幫助解決其他人遇到類似問題的情況。爲了使.NET端的服務器能夠向客戶端發送消息,它還需要與集線器建立連接。

var connection = new HubConnection("http://localhost/"); 
connection.Start(); 
connection.Notify("Hello"); 

退房在官方例子:

https://github.com/SignalR/SignalR/blob/master/samples/Microsoft.AspNet.SignalR.Client.Samples/Program.cs

相關問題