Библиотека SignalR выдает ошибку, когда приложение работает без точек отладки и работает нормально во время отладки. - PullRequest
0 голосов
/ 12 апреля 2020

Я создал основное чат-приложение. net, используя SignalR, и мне нужно перейти к следующему пользователю, нажав кнопку «Далее». Когда я нажимаю следующую кнопку, она вызывает метод "getRemoteClientNext" внутри класса Hub

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

1 Ответ

0 голосов
/ 13 апреля 2020

Это пахнет как состояние гонки, как предположил SomeStudent. Читая первые несколько строк кода в методе getRemoteClient(), вы пропускаете await.

Я не могу сказать со 100% уверенностью, что это исправит это, но я уверен, что это может стать проблемой, даже если это не виновник.

// Add await here.
var CurrentAppUser = await _userManager.FindByNameAsync(name);
...