我正在使用SignalR
来更新Asp.net MVC中的用户任务
但是我遇到了问题,在我的集线器SignalR
类中,下面的方法不会调用客户端方法来更新客户端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;
}
}
}
答案 0 :(得分:1)
在调用start方法之前,您必须至少注册一个事件处理程序
通常在调用start方法之前注册事件处理程序 建立连接。如果你想注册一些活动 建立连接后的处理程序,你可以这样做,但你 必须在调用之前注册至少一个事件处理程序 启动方法。其中一个原因是一个中心可能有很多 应用程序,但您不希望触发OnConnected事件 如果您只使用其中一个,那么每个Hub。当。。。的时候 建立连接,在Hub上存在客户端方法 proxy是告诉SignalR触发OnConnected事件的东西。如果你 在调用start方法之前,请不要注册任何事件处理程序 将能够在Hub上调用方法,但是Hub的OnConnected 将不会调用方法,也不会从中调用任何客户端方法 服务器
答案 1 :(得分:0)
只是为了尝试一下,您是否尝试过使用hub上下文传递的connectionID? this.Context.ConnectionId
这是客户端调用的当前ID,将您提取的ID与其进行比较并查看其是否正确。
我没有调用客户端方法的其他问题是代理集线器在连接开始之前还没有正确初始化,所以我会调查它。希望它有所帮助。