c# – 如何使用ASP.NET Hosting在Nancy中使用SignalR将服务器与客户端进行通信?

我在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已初始化.也许客户端集合已初始化但为空.谁知道?也许你这样做.

上一篇:c# – 如何在ASP.NET Core SignalR v2.1中增加超时设置?


下一篇:javascript – 初始加载和更新之间的SignalR