【发布时间】:2017-11-07 11:43:15
【问题描述】:
下面是我基于ASP.Net documentation为SignalR实现编写的代码,我使用手动代理创建方法。我只能看到发生协商并收到连接 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'); });
通常在调用
start方法之前注册事件处理程序 建立连接。如果你想注册一些事件 建立连接后的处理程序,您可以这样做,但是您 在调用start方法。造成这种情况的一个原因是在一个 应用程序,但您不想触发OnConnected事件 每个集线器,如果您只使用其中一个集线器。当。。。的时候 连接建立后,Hub 上存在客户端方法 proxy 告诉 SignalR 触发OnConnected事件。如果你 在调用start方法之前不要注册任何事件处理程序,你 将能够调用 Hub 上的方法,但 Hub 的OnConnected方法不会被调用,也不会从 服务器。
我无法弄清楚过去两天我错过了什么。
更新:
即使我尝试通过将<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 请在下面查看我的回答。抱歉耽搁了