SignalR2 OnConnected未按文档

时间:2017-11-07 11:43:16

标签: asp.net signalr signalr-2

以下是我为基于ASP.Net documentationSignalR实现编写的代码,我使用手动代理创建方法。我只能看到协商发生并收到了连接ID。

当我开始连接时,我无法看到我的集线器中的OnConnected方法被执行。根据文档中的注释部分,我在调用start方法之前附加了事件处理程序

SignalR Hub

public class MyTestHub: Hub
{
    private static Dictionary<int, List<string>> userConnections 
                                                     = new Dictionary<int, List<string>>();

    public override Task OnConnected()
    {
        RegisterUserConnectionInMap();
        return base.OnConnected();
    }
}

Startup.cs

     app.Map(
           "/signalr",
            map =>
            {
              var hubConfiguration = new HubConfiguration { EnableDetailedErrors = true};
              map.RunSignalR(hubConfiguration);
            });

Javascript客户端代码

var connection = $.hubConnection();
var contosoChatHubProxy = connection.createHubProxy('MyTestHub');
contosoChatHubProxy.on('addContosoChatMessageToPage', function(userName:any, message:any) {
    console.log(userName + ' ' + message);
});
connection.start()
.done(function(){ console.log('Now connected, connection ID=' + connection.id); })
.fail(function(){ console.log('Could not connect'); });

Note section in documentation

  

通常在调用start方法之前注册事件处理程序   建立连接。如果你想注册一些活动   建立连接后的处理程序,你可以这样做,但你   必须在调用之前注册至少一个事件处理程序   start方法。其中一个原因是一个中心可能有很多   应用程序,但您不希望触发OnConnected事件   如果您只使用其中一个,那么每个Hub。当。。。的时候   建立连接,在Hub上存在客户端方法   proxy是告诉SignalR触发OnConnected事件的东西。如果你   在调用start方法之前,请不要注册任何事件处理程序   将能够在Hub上调用方法,但是Hub的OnConnected   将不会调用方法,也不会从中调用任何客户端方法   服务器

我无法弄清楚过去两天我想念的是什么。

更新

即使我尝试使用自动生成的代理类,也可以使用<script src="~/SignalR/hubs"包含以下客户端代码。 仍然OnConnected未解雇

var contosoChatHubProxy = $.connection.myTestHub;
contosoChatHubProxy.client.addContosoChatMessageToPage = function (name, message) {
    console.log(userName + ' ' + message);
};
$.connection.hub.start()
    .done(function(){ console.log('Now connected, connection ID=' + $.connection.hub.id); })
    .fail(function(){ console.log('Could not Connect!'); });

connectton

后的控制台日志

enter image description here

1 个答案:

答案 0 :(得分:1)

我已经完成了以下解决方案。希望对您有所帮助。

declare var $: any;

@Injectable()
export class CityChangeNotifier {

constructor(private appService: AppService, private router: Router) {
    this.connection = $.hubConnection();
    this.CityChangeHub = this.connection.createHubProxy('CityChangeNotificationHub');
    this.CityChangeHub
        .on('CityUpdatedByServer', (newLocation:any, connectionId:string) => this.onCityUpdatedByServer(newLocation, connectionId));
    this.connection.transportConnectTimeout = 10000;
    this.startConnection();  
 }

private startConnection(): void {
    let that = this;
    this.connection.start()
        .done((connection: any) => { that.connectionId = connection.id; })
        .fail(() => { });  
  }  
}