下面是我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!'); });
连接后的控制台日志