从SignalR3 rc1 vnext应用程序中调用方法时不会发生任何事情

本文关键字:任何事 方法 rc1 SignalR3 vnext 应用程序 调用 | 更新日期: 2023-09-27 18:25:40

在我当前的设置中,我有一个ASP.NET 5 vNext项目正在运行。我已经安装了SignalR Server 3.0.0-rc1-final,我可以通过我的网络接口连接到我的集线器:

var visitorHub = $.connection.visitorsHub;
visitorHub.client.visitorEvent = function (message) {
   $("#visitorinfo").append("<li>" + message + "</li>");
};
$.connection.hub.start().done(function () {
   visitorHub.invoke("listenToEvents", "TestID");
});

因此,我们正在从集线器侦听visitorEvent,并且在调用listenToEvents时调用visitorEvent。

我现在面临的挑战是,我正在尝试从ASP.NET应用程序中进行通知。使用IoC中的内置,SqlDependency用于侦听SQL服务器中的事件。同样,这是按预期工作的,但当我试图通过HubContext调用集线器时,什么也没发生。

我已经注入了IConnectionManager,并能够使用获取我的HubContext

var context = this.manager.GetHubContext<VisitorsHub>();

但当我做以下事情时:

context.Clients.All.visitorEvent("2");

什么也没发生。

我不确定为什么什么都没发生,我将如何调试它?

我的VisitorHub代码是:

public class VisitorsHub : Hub
{
    public async Task ListenToEvents(string visitorId)
    {
        this.NotifyVisitorListeners();
    }
    public void NotifyVisitorListeners()
    {
        this.Clients.All.visitorEvent("Event");
    }
}

从SignalR3 rc1 vnext应用程序中调用方法时不会发生任何事情

您可以通过以下方式启用客户端日志记录:

$.connection.hub.logging = true;
$.connection.hub.start();

或不生成代理:

var connection = $.hubConnection();
connection.logging = true;
connection.start();

否则,当使用invoke(没有代理的方法)时,方法不会重命名为camelCase,而是保持原样,在您的案例中为camelCase。

为了克服这个问题,您可以简单地在两端重命名方法名称,或者在后端添加HubMethodName装饰器:

[HubMethodName("listenToEvents")]
public async Task ListenToEvents(string visitorId)
{
    this.NotifyVisitorListeners();
}