我發現的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()
被解僱了,我得到:
這是因爲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
已初始化。也許客戶端的集合被初始化,但是是空的。誰知道?也許你會。 :)
同樣,我的主要目標是能夠隨時從代碼中的任何位置向瀏覽器發送事件/通知。那是過分的要求?我應該在這裏做什麼?