2

下面是我SignalR根据ASP.Net 文档编写的实现代码,我使用手动代理创建方法。我只能看到发生协商并收到连接 ID。

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

SignalR 集线器

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

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

启动.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'); });

文档中的注释部分

start通常,您在调用建立连接的方法之前注册事件处理程序。start如果您想在建立连接后注册一些事件处理程序,您可以这样做,但您必须在调用方法之前至少注册一个事件处理程序 。原因之一是应用程序中可能有许多 Hub,但OnConnected如果您只使用其中一个 Hub,您不希望在每个 Hub 上触发事件。建立连接后,集线器代理上存在客户端方法就是告诉 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!'); });

连接后的控制台日志

在此处输入图像描述

4

1 回答 1

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(() => { });  
  }  
}
于 2018-08-21T08:48:57.380 回答