我为SignalR找到的大多数示例都假设是ASP.NET(MVC或不是MVC)。我正在使用NancyFX。我只有一个问题,所以我希望有一些我忽略的东西,或者我需要在Nancy做的一些事情,以弥补不是ASP.NET。
我的一个目标是能够在服务器事件发生时通知客户端浏览器。我不打算用hub方法替换我的Nancy路由。但我希望能够从我的路线(动作)调用浏览器。
我按照SignalR Wiki中的示例创建了非常简单的Hub。我甚至不确定我是否需要它,因为我不打算将客户端调用到服务器。
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();
});
就像我说的那样,“启动”集线器工作并向客户端发送通知。很酷。但是,那时,我的主要目标还没有完成。我需要从我的代码中的其他地方发起这些通知,因为它们可能与“请求”没有直接关联。
我尝试在我的nancy模块中注入我的IUserNotifier以用于路由,但是当Notify()
被触发时,我得到:
那是因为Clients
基类上的Hub
属性为null(尚未初始化)。所以,我换了档。我尝试按照多个示例进行操作,包括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 });
};
}
}
我的Nancy路线执行时没有抛出错误。除了我的浏览器从未收到消息。如果我在路由中设置断点,我可以看到Clients
已初始化。也许客户端集合已初始化但为空。谁知道?也许你这样做。 :)
同样,我的主要目标是能够随时在我的代码中的任何位置向浏览器发送事件/通知。那是过分的要求?我该怎么办?
答案 0 :(得分:2)
我相信你一定已经找到了答案。但是,我想我可以尝试帮助以防其他人遇到类似的问题。为了使.NET端的服务器向客户端发送消息,还需要与集线器建立连接。
var connection = new HubConnection("http://localhost/");
connection.Start();
connection.Notify("Hello");
查看官方示例: