[英]Invoking SignalR method after receiving message in javascript client
[英]Clients.Client(Context.ConnectionId).Message(name) does not call to the client JavaScript method in SignalR
我正在使用SignalR
更新Asp.net MVC中的用戶任務。
但是我有問題,在我的中心SignalR
類中,以下方法未調用客戶端方法來使用客戶端connectionId
更新任務。
當用戶登錄系統時,我從連接列表中獲取connectionId
。
問題是用戶已經通過使用connectionId
成功注銷了,但是在這種情況下這是更新其任務的問題嗎?
問題出在哪兒?
強SignalR集線器方法文本
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方法之前,必須至少注冊一個事件處理程序。 原因之一是應用程序中可能有許多集線器,但是如果您只想使用其中一個集線器,則不想在每個集線器上觸發OnConnected事件。 建立連接后,指示集線器觸發OnConnected事件的集線器代理上存在客戶端方法。 如果您在調用start方法之前未注冊任何事件處理程序,則可以在Hub上調用方法,但是不會調用Hub的OnConnected方法,並且不會從服務器調用任何客戶端方法。
只是為了嘗試,您是否嘗試過使用由中心上下文傳遞的connectionID? this.Context.ConnectionId
這是客戶端調用的當前ID,將您拉到的ID進行比較,看其是否正確。
我沒有調用客戶端方法時遇到的另一個問題是,代理集線器在連接開始之前尚未正確初始化,因此我也會對此進行調查。 希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.