以下是我为基于ASP.Net documentation的SignalR
实现编写的代码,我使用手动代理创建方法。我只能看到协商发生并收到了连接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'); });
通常在调用
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
后的控制台日志答案 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(() => { });
}
}