SignalR hubConnection.on 不工作。 Clients.Others.SendAsync 和 hubConnection.on 沟通不畅
SignalR hubConnection.on is not working. Clients.Others.SendAsync and hubConnection.on are not communicating well
我目前正在尝试构建一个涉及 SignalR 的集线器连接功能的应用程序。最终,我想让该应用程序能够处理实时聊天,但首先我想检查 SignalR 的基本部分是否正常工作。
我试图确保在用户登录时显示通知集线器连接的 toastr,但问题是没有显示 toastr。这是我的一些代码。
[PresenceHub.cs]
public class PresenceHub : Hub
{
private readonly ILogger<PresenceHub> _logger;
public PresenceHub(ILogger<PresenceHub> logger)
{
_logger = logger;
}
public override async Task OnConnectedAsync()
{
_logger.LogInformation(Context.User.GetUserName());
await Clients.Others.SendAsync("UserIsOnline", Context.User.GetUserName());
}
public override async Task OnDisconnectedAsync(Exception exception)
{
await Clients.Others.SendAsync("UserIsOffline", Context.User.GetUserName());
await base.OnDisconnectedAsync(exception);
}
...
[presence.service.ts]
export class PresenceService {
hubUrl = environment.hubUrl;
private hubConnection: HubConnection
constructor(private toastr: ToastrService) { }
createHubConnection(user: User){
this.hubConnection = new HubConnectionBuilder()
.withUrl(this.hubUrl + 'presence', {
accessTokenFactory: () => user.token
})
.withAutomaticReconnect()
.build()
this.hubConnection
.start()
.then(() => {
console.log("hubConnection started for " + user.username);
console.log("user token: " + user.token);
this.toastr.success("Inside the createHubConnection")
})
.catch(error => console.log(error))
this.hubConnection.on('UserIsOnline', username => {
console.log(username + ' has connected');
this.toastr.success(username + 'has connected');
})
this.hubConnection.on('UserIsOffline', username => {
console.log(username + ' has disconnected');
this.toastr.success(username + ' has disconnected');
})
...
通过上面的代码,我已经确认
- 在
PresenceHub.cs
中OnConnectedAsync
中放置的记录器显示获取的用户名,这意味着该方法被正确调用。
- 用户。 console.log 中的标记得到正确显示,这意味着
new HubConnectionBuilder()
部分成功。
presence.service.ts
中this. hub connection. start
中的toastr调用成功,说明问题不在toastr本身
-
PresenceHub.cs
和 presence.service.ts
中 UserIsOnline
的拼写匹配。
等等
知道我应该调查哪些其他可能性吗?
问题是您在服务器端使用 Clients.Others
。这意味着将此消息发送给所有 other 连接,而不是您的连接。如果您想向自己发送消息,您需要 Clients.Caller
,或者向所有连接发送消息 Clients.All
。
此外,您应该将 this.hubConnection.on('UserIsOnline', ...)
移动到 this.hubConnection.start()
之前,以消除在您的方法在客户端注册之前服务器响应的可能竞争条件。
我目前正在尝试构建一个涉及 SignalR 的集线器连接功能的应用程序。最终,我想让该应用程序能够处理实时聊天,但首先我想检查 SignalR 的基本部分是否正常工作。
我试图确保在用户登录时显示通知集线器连接的 toastr,但问题是没有显示 toastr。这是我的一些代码。
[PresenceHub.cs]
public class PresenceHub : Hub
{
private readonly ILogger<PresenceHub> _logger;
public PresenceHub(ILogger<PresenceHub> logger)
{
_logger = logger;
}
public override async Task OnConnectedAsync()
{
_logger.LogInformation(Context.User.GetUserName());
await Clients.Others.SendAsync("UserIsOnline", Context.User.GetUserName());
}
public override async Task OnDisconnectedAsync(Exception exception)
{
await Clients.Others.SendAsync("UserIsOffline", Context.User.GetUserName());
await base.OnDisconnectedAsync(exception);
}
...
[presence.service.ts]
export class PresenceService {
hubUrl = environment.hubUrl;
private hubConnection: HubConnection
constructor(private toastr: ToastrService) { }
createHubConnection(user: User){
this.hubConnection = new HubConnectionBuilder()
.withUrl(this.hubUrl + 'presence', {
accessTokenFactory: () => user.token
})
.withAutomaticReconnect()
.build()
this.hubConnection
.start()
.then(() => {
console.log("hubConnection started for " + user.username);
console.log("user token: " + user.token);
this.toastr.success("Inside the createHubConnection")
})
.catch(error => console.log(error))
this.hubConnection.on('UserIsOnline', username => {
console.log(username + ' has connected');
this.toastr.success(username + 'has connected');
})
this.hubConnection.on('UserIsOffline', username => {
console.log(username + ' has disconnected');
this.toastr.success(username + ' has disconnected');
})
...
通过上面的代码,我已经确认
- 在
PresenceHub.cs
中OnConnectedAsync
中放置的记录器显示获取的用户名,这意味着该方法被正确调用。 - 用户。 console.log 中的标记得到正确显示,这意味着
new HubConnectionBuilder()
部分成功。 presence.service.ts
中this. hub connection. start
中的toastr调用成功,说明问题不在toastr本身-
PresenceHub.cs
和presence.service.ts
中UserIsOnline
的拼写匹配。 等等
知道我应该调查哪些其他可能性吗?
问题是您在服务器端使用 Clients.Others
。这意味着将此消息发送给所有 other 连接,而不是您的连接。如果您想向自己发送消息,您需要 Clients.Caller
,或者向所有连接发送消息 Clients.All
。
此外,您应该将 this.hubConnection.on('UserIsOnline', ...)
移动到 this.hubConnection.start()
之前,以消除在您的方法在客户端注册之前服务器响应的可能竞争条件。