4

我为SignalR找到的大多数示例都假设为 ASP.NET(无论是否为 MVC)。我正在使用NancyFX。我只有一个问题,所以我希望有些事情我忽略了,或者我需要在 Nancy 做一些事情来弥补不是 ASP.NET。

我的一个目标是能够在服务器事件发生时通知客户端浏览器。我不打算用集线器方法替换我的南希路线。但我希望能够从我的路由(操作)调用浏览器。

我按照SignalR Wiki中的示例创建了非常简单的集线器。我什至不确定我是否需要它,因为我不打算将客户端调用到服务器。

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

我使用了一个接口,希望以后能够注入相同的集线器以在我的 nancy 路由中使用……我不确定这是否可行。

[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 页面中有关集线器的示例,该示例位于名为“从集线器外部通过集线器进行广播”的部分:

public class NotifierModule : NancyModule
{
    public NotifierModule(){

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

我的南希路线执行没有抛出错误。除了我的浏览器永远不会收到消息。如果我在路由中设置断点,我可以看到它Clients已初始化。也许客户端的集合已初始化但为空。谁知道?也许你会。:)

同样,我的主要目标是能够随时随地从我的代码中的任何位置向浏览器发送事件/通知。那是过分的要求?我应该在这里做什么?

4

1 回答 1

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

于 2013-05-19T02:54:41.753 回答