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

同样,我的主要目标是能够随时在我的代码中的任何位置向浏览器发送事件/通知.那是过分的要求?我该怎么办?

最佳答案 我相信你一定已经找到了答案.但是,我想我可以尝试帮助以防其他人遇到类似的问题.为了使.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

点赞