javascript - Clients.Client(Context.ConnectionId).Message(name) 不调用 SignalR 中的客户端 JavaScript 方法
问题描述
我SignalR
用来更新 Asp.net MVC 中的用户任务。
但是我有问题,在我的集线器SignalR
类中,下面的方法不会调用客户端方法来使用 client 更新任务connectionId
。当用户登录系统时,
我从连接列表中获取。
问题是用户已通过使用成功注销,但在这种情况下更新他的任务有问题吗?
问题出在哪里?connectionId
connectionId
强 SignalR Hub 方法文本
public void InvitationForConference(long assignedTo)
{
try
{
var connectionId = GetUserCoonectionId(assignedTo);
// Update Tasks
Clients.Client(connectionId).invitationForAllConference(assignedTo);
// Update Notifications
Clients.Client(connectionId).invitationNotificationForAllConference(assignedTo);
}
catch (Exception ex)
{
throw ex;
}
}
强大的 Js 客户端方法文本
signalR.client.invitationForAllConference = function (AssignedId)
{
debugger
LoadTasks(AssignedId);
};
**strong Js File text**
var IsLogin = '';
IsLogin = $("#LoginConnectionId").val();
var signalR = $.connection.signalRHUB;
debugger;
if (IsLogin == "OPEN") {
$.connection.hub.start().done(function () {
debugger
IsLogin == "CLOSE";
signalR.server.createConnection();
});
}
else {
$.connection.hub.start().done(function () { });
}
signalR.client.invitationForAllConference = function (AssignedId) {
debugger
LoadTasks(AssignedId);
};
signalR.client.invitationNotificationForAllConference = function (AssignedId) {
debugger
LoadNotificationAlerts(AssignedId);
};
[Authorize]
public class SignalRHUB : Hub
{
private readonly static ConnectionMapping<string> _connections =
new ConnectionMapping<string>();
private readonly IUnitOfWork _unitOfWork;
private readonly UserManager<IdentityUser, long> _userManager;
private readonly IUnitOfWork _unitOfWorkLazyLoad;
public SignalRHUB(IUnitOfWork unitOfWork, IUnitOfWork unitOfWorkLazyLoad)
{
try
{
//_userManager = userManager;
_unitOfWork = unitOfWork;
_unitOfWorkLazyLoad = unitOfWorkLazyLoad;
}
catch (Exception ex)
{
}
}
public void InvitationForConference(long assignedTo)
{
try
{
var connectionId = GetUserCoonectionId(assignedTo);
// Update Tasks
Clients.Client(connectionId).invitationForAllConference(assignedTo);
// Update Notifications
Clients.Client(connectionId).invitationNotificationForAllConference(assignedTo);
}
catch (Exception ex)
{
throw ex;
}
}
}
解决方案
在调用 start 方法之前,您必须至少注册一个事件处理程序
通常,您在调用 start 方法建立连接之前注册事件处理程序。如果您想在建立连接后注册一些事件处理程序,您可以这样做,但您必须在调用 start 方法之前注册至少一个事件处理程序。原因之一是应用程序中可能有多个 Hub,但如果您只使用其中一个 Hub,您不希望在每个 Hub 上触发 OnConnected 事件。建立连接后,集线器代理上存在客户端方法就是告诉 SignalR 触发 OnConnected 事件的原因。如果您在调用 start 方法之前没有注册任何事件处理程序,您将能够调用 Hub 上的方法,但 Hub 的 OnConnected 方法不会
推荐阅读
- javascript - 如何让 React-Dates DayPicker 单个 DateController 使用自定义输入
- git - `git notes append` creates additional blank line
- c++11 - 是否可以根据二进制搜索来实现 std::lower_bound ?
- java - 使用自定义异常处理特定场景
- google-apps-script - 脚本 - DriveApp.getFilesByName - 获取最新版本?
- python - 使用 python pandas 找到最高的增长?
- r - 使用 AlgDesign 包的 optFederov 的问题
- r - nVennr。更改标准表格数字并删除图例
- bitbucket - 从 Gerrit 到 Bitbucket 的远程分支
- javascript - $root 被 shallowMount 包装器 $root 覆盖