我在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()被触发时,我得到:
这是因为Hub基类上的Clients属性为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已初始化.也许客户端集合已初始化但为空.谁知道?也许你这样做.