He escrito el siguiente código para establecer la conexión con el servidor SignalR e invocar un método concentrador:
<script> var connection = new signalR.HubConnectionBuilder().withUrl("/signalRServer").withAutomaticReconnect().build(); connection.start().then( result => { console.log("RealTime connection is now established") }); function ShowMessageAndUpdate(messageId, data){ $('#messageModal').modal('show'); $('#mainTxt').text(data); var formData2 = new FormData(); formData2.append("messageId", messageId); $.ajax({ type: "POST", url: "Messages/UpdateMessageStatus", contentType: false, processData: false, data: formData2, success: function (response) { if (response.success) { console.log("status changed successfully!"); var table2 = $('#table2').DataTable(); table2.ajax.reload(); connection.invoke("MessageUpdate", messageId).catch(function(err){ return console.error(err) }); } else { console.log("status change failed."); } }, error: function (error) { console.log(error); } }); } </script>
El método hub se invoca cuando la respuesta exitosa de jQuery es True
. El problema es que la consola no puede establecer una conexión con el concentrador.
Mensajes: 377 Error: no se pudo invocar 'MessageUpdate' debido a un error en el servidor. en H. (signalr.js:1:13973) en LI (signalr.js:1:14804) en XLconnection.onreceive (signalr.js:1:10649) en WebSocket.r.onmessage (signalr.js:1:27565 )
¿Hay algún problema con mi código del lado del cliente?
Actualización: el método en el concentrador es el siguiente:
public async Task MessageUpdate(int messageId) { int destination = _messageRepository.GetSenderIdByMessageId(messageId); string username = _userRepository.GetUserNameById(destination); var userId = NtoIdMappingTable.GetValueOrDefault(username); await Clients.User(userId.FirstOrDefault()).SendAsync("ReceiveMessageUpdate"); }
El problema está en el lado del cliente, porque el método no se ejecuta durante la depuración. la conexión no se puede establecer correctamente cuando obtiene el parámetro de function(parameter)
.