【问题标题】:SignalR2 OnConnected not working as per documentationSignalR2 OnConnected 没有按照文档工作
【发布时间】:2017-11-07 11:43:15
【问题描述】:

下面是我基于ASP.Net documentationSignalR实现编写的代码,我使用手动代理创建方法。我只能看到发生协商并收到连接 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();
    }
}

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 上存在客户端方法 proxy 告诉 SignalR 触发 OnConnected 事件。如果你 在调用 start 方法之前不要注册任何事件处理程序,你 将能够调用 Hub 上的方法,但 Hub 的 OnConnected 方法不会被调用,也不会从 服务器。

我无法弄清楚过去两天我错过了什么。

更新

即使我尝试通过将&lt;script src="~/SignalR/hubs" 包含在以下客户端代码中来使用自动生成的代理类。 Still 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!'); });

连接后的控制台日志

【问题讨论】:

  • 你能展示整个客户端脚本吗?你有任何浏览器控制台输出吗?
  • @Tester 附截图
  • 您找到解决方案了吗?
  • @NguyenTran 请在下面查看我的回答。抱歉耽搁了

标签: asp.net signalr signalr-2


【解决方案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(() => { });  
  }  
}

【讨论】:

  • 谢谢。有用!我错过了这条线this.CityChangeHub .on('CityUpdatedByServer', (newLocation:any, connectionId:string) =&gt; this.onCityUpdatedByServer(newLocation, connectionId));
猜你喜欢
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2019-07-24
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多