SignalR 库在没有调试点的情况下应用 运行 时抛出错误,并且在调试时工作正常
SignalR library throws error when it application run without debug points and work fine while debugging
我已经使用 SignalR 创建了一个 .net 核心聊天应用程序,我需要通过单击下一步按钮转到下一个用户。当我单击下一步按钮时,它将触发集线器 class
内的方法 "getRemoteClientNext"
public async Task getRemoteClientNext(string RemoteUserId)
{
var name = Context.User.Identity.Name;
var CurrentAppUser = _userManager.FindByNameAsync(name);
if(RemoteUserId != null) {
using (var db = _dBContext)
{
var remotename = db.Users.Find(RemoteUserId);
var RemoteUser = db.Connections.Where(c => c.UsersId != CurrentAppUser.Result.Id && c.UsersId != RemoteUserId && c.RemoteConnected == false).AsEnumerable().GroupBy(c => c.UsersId);
//var remoteConnection = db.Connections.Where(u => u.UsersId == CurrentAppUser.Result.Id || u.UsersId == RemoteUserId).ToList();
//remoteConnection.ForEach(i => i.RemoteConnected = false);
var currntUserConnection = db.Connections.Where(u => u.UsersId == CurrentAppUser.Result.Id).AsEnumerable().FirstOrDefault();
currntUserConnection.RemoteConnected = false;
db.SaveChanges();
var RemoteUserConnection = db.Connections.Where(u => u.UsersId == RemoteUserId).AsEnumerable().FirstOrDefault();
if (RemoteUserConnection != null)
{
RemoteUserConnection.RemoteConnected = false;
}
db.SaveChanges();
var connec = db.Connections.Where(c => c.UsersId == RemoteUserId);
if (connec.Count() == 0)
{
await Clients.Caller.SendAsync("ClienErrors", "The user is no longer connected");
}
else
{
foreach (var connection in connec)
{
await Clients.Client(connection.ConnectionID).SendAsync("maintainConnectionStatus", "Connecting a remote user......");
}
}
await Clients.Caller.SendAsync("maintainConnectionStatus", "Connecting a remote user......");
if (RemoteUser.Count() == 0)
{
await Clients.Caller.SendAsync("maintainConnectionStatus", "Connecting a remote user......");
}
else
{
var selectedRemoteUser = RemoteUser.First().ToList();
var currentUserConnection = db.Connections.Where(u => u.UsersId == CurrentAppUser.Result.Id).AsEnumerable().FirstOrDefault();
// selectedRemoteUser.ForEach(c => c.RemoteConnected = true, c.Remo) ;
foreach(Connections con in selectedRemoteUser)
{
con.RemoteConnected = true;
con.RemoteConnectionID = currentUserConnection.ConnectionID;
currentUserConnection.RemoteConnectionID = con.ConnectionID;
}
// var currentUserConnection = db.Connections.Where(u => u.UsersId == CurrentAppUser.Result.Id).AsEnumerable().FirstOrDefault();
var RemoteId = selectedRemoteUser.Select(u => u.UsersId).FirstOrDefault();
var RemoteName = db.Users.Find(RemoteId);
currentUserConnection.RemoteConnected = true;
db.SaveChanges();
//var RemoteId = selectedRemoteUser.Select(u => u.UsersId).FirstOrDefault();
//var RemoteName = db.Users.Find(RemoteId);
var connec2 = db.Connections.Where(c => c.UsersId == RemoteId);
if (connec2.Count() ==0)
{
await Clients.Caller.SendAsync("ClienErrors", "The user is no longer connected");
}
else
{
foreach (var connection in connec2)
{
await Clients.Client(connection.ConnectionID).SendAsync("SendRemoteUserId", CurrentAppUser.Result.Id, CurrentAppUser.Result.FirstName);
}
}
await Clients.Caller.SendAsync("SendRemoteUserId", RemoteId, RemoteName.FirstName);
}
}
}
}
在java脚本中事件就像
document.getElementById("next").addEventListener("click", function (event) {
connection.invoke("getRemoteClientNext", RemoteUserId);
});
我遇到的问题是当我单击下一步按钮时 "getRemoteClientNext" 将被触发并且在调试时工作正常。如果我禁用所有调试点和 运行 应用程序,这将不起作用。但其他功能(如使用集线器发送聊天消息)运行良好。然后我检查控制台,我看到了错误消息
Uncaught (in promise) Error: An unexpected error occurred invoking 'getRemoteClientNext' on the server.
at _this.callbacks. (signalr.js:2088)
at HubConnection.processIncomingData (signalr.js:2182)
at WebSocketTransport.HubConnection.connection.onreceive (signalr.js:1905)
at WebSocket.webSocket.onmessage (signalr.js:3949)
我删除了 SignalR 并尝试再次安装它,但它不起作用,并且在添加客户端库时也只显示 Jquery.SignalR.js 和 Jquery.SignalR.min.js 文件。所以我从另一个项目手动添加了 Signalr.js 文件。
任何人都可以告诉我为什么会发生这种情况是 SignalR 库中的错误
正如 SomeStudent 所建议的,这闻起来像竞争条件。通读 getRemoteClient()
方法中的前几行代码,您缺少 await
.
我不能 100% 肯定地说这会解决它,但我敢肯定它可能会成为一个问题,即使这不是罪魁祸首。
// Add await here.
var CurrentAppUser = await _userManager.FindByNameAsync(name);
我已经使用 SignalR 创建了一个 .net 核心聊天应用程序,我需要通过单击下一步按钮转到下一个用户。当我单击下一步按钮时,它将触发集线器 class
内的方法 "getRemoteClientNext"public async Task getRemoteClientNext(string RemoteUserId)
{
var name = Context.User.Identity.Name;
var CurrentAppUser = _userManager.FindByNameAsync(name);
if(RemoteUserId != null) {
using (var db = _dBContext)
{
var remotename = db.Users.Find(RemoteUserId);
var RemoteUser = db.Connections.Where(c => c.UsersId != CurrentAppUser.Result.Id && c.UsersId != RemoteUserId && c.RemoteConnected == false).AsEnumerable().GroupBy(c => c.UsersId);
//var remoteConnection = db.Connections.Where(u => u.UsersId == CurrentAppUser.Result.Id || u.UsersId == RemoteUserId).ToList();
//remoteConnection.ForEach(i => i.RemoteConnected = false);
var currntUserConnection = db.Connections.Where(u => u.UsersId == CurrentAppUser.Result.Id).AsEnumerable().FirstOrDefault();
currntUserConnection.RemoteConnected = false;
db.SaveChanges();
var RemoteUserConnection = db.Connections.Where(u => u.UsersId == RemoteUserId).AsEnumerable().FirstOrDefault();
if (RemoteUserConnection != null)
{
RemoteUserConnection.RemoteConnected = false;
}
db.SaveChanges();
var connec = db.Connections.Where(c => c.UsersId == RemoteUserId);
if (connec.Count() == 0)
{
await Clients.Caller.SendAsync("ClienErrors", "The user is no longer connected");
}
else
{
foreach (var connection in connec)
{
await Clients.Client(connection.ConnectionID).SendAsync("maintainConnectionStatus", "Connecting a remote user......");
}
}
await Clients.Caller.SendAsync("maintainConnectionStatus", "Connecting a remote user......");
if (RemoteUser.Count() == 0)
{
await Clients.Caller.SendAsync("maintainConnectionStatus", "Connecting a remote user......");
}
else
{
var selectedRemoteUser = RemoteUser.First().ToList();
var currentUserConnection = db.Connections.Where(u => u.UsersId == CurrentAppUser.Result.Id).AsEnumerable().FirstOrDefault();
// selectedRemoteUser.ForEach(c => c.RemoteConnected = true, c.Remo) ;
foreach(Connections con in selectedRemoteUser)
{
con.RemoteConnected = true;
con.RemoteConnectionID = currentUserConnection.ConnectionID;
currentUserConnection.RemoteConnectionID = con.ConnectionID;
}
// var currentUserConnection = db.Connections.Where(u => u.UsersId == CurrentAppUser.Result.Id).AsEnumerable().FirstOrDefault();
var RemoteId = selectedRemoteUser.Select(u => u.UsersId).FirstOrDefault();
var RemoteName = db.Users.Find(RemoteId);
currentUserConnection.RemoteConnected = true;
db.SaveChanges();
//var RemoteId = selectedRemoteUser.Select(u => u.UsersId).FirstOrDefault();
//var RemoteName = db.Users.Find(RemoteId);
var connec2 = db.Connections.Where(c => c.UsersId == RemoteId);
if (connec2.Count() ==0)
{
await Clients.Caller.SendAsync("ClienErrors", "The user is no longer connected");
}
else
{
foreach (var connection in connec2)
{
await Clients.Client(connection.ConnectionID).SendAsync("SendRemoteUserId", CurrentAppUser.Result.Id, CurrentAppUser.Result.FirstName);
}
}
await Clients.Caller.SendAsync("SendRemoteUserId", RemoteId, RemoteName.FirstName);
}
}
}
}
在java脚本中事件就像
document.getElementById("next").addEventListener("click", function (event) {
connection.invoke("getRemoteClientNext", RemoteUserId);
});
我遇到的问题是当我单击下一步按钮时 "getRemoteClientNext" 将被触发并且在调试时工作正常。如果我禁用所有调试点和 运行 应用程序,这将不起作用。但其他功能(如使用集线器发送聊天消息)运行良好。然后我检查控制台,我看到了错误消息
Uncaught (in promise) Error: An unexpected error occurred invoking 'getRemoteClientNext' on the server.
at _this.callbacks. (signalr.js:2088)
at HubConnection.processIncomingData (signalr.js:2182)
at WebSocketTransport.HubConnection.connection.onreceive (signalr.js:1905)
at WebSocket.webSocket.onmessage (signalr.js:3949)
我删除了 SignalR 并尝试再次安装它,但它不起作用,并且在添加客户端库时也只显示 Jquery.SignalR.js 和 Jquery.SignalR.min.js 文件。所以我从另一个项目手动添加了 Signalr.js 文件。
任何人都可以告诉我为什么会发生这种情况是 SignalR 库中的错误
正如 SomeStudent 所建议的,这闻起来像竞争条件。通读 getRemoteClient()
方法中的前几行代码,您缺少 await
.
我不能 100% 肯定地说这会解决它,但我敢肯定它可能会成为一个问题,即使这不是罪魁祸首。
// Add await here.
var CurrentAppUser = await _userManager.FindByNameAsync(name);