c# - net - signalr test client
¿Cómo obtener la identificación de conexión del cliente signalR en el lado del servidor? (2)
Necesito obtener la identificación de conexión de un cliente. Sé que puedes obtenerlo desde el lado del cliente usando $.connection.hub.id
. Lo que necesito es ingresar mientras estoy en un servicio web que tengo y que actualiza los registros en una base de datos, mostrando a su vez la actualización en una página web. Soy nuevo en signalR y stackoverflow, por lo que cualquier consejo sería apreciado. En la página web de mi cliente tengo esto:
<script type="text/javascript">
$(function () {
// Declare a proxy to reference the hub.
var notify = $.connection.notificationHub;
// Create a function that the hub can call to broadcast messages.
notify.client.broadcastMessage = function (message) {
var encodedMsg = $(''<div />'').text(message).html();// Html encode display message.
$(''#notificationMessageDisplay'').append(encodedMsg);// Add the message to the page.
};//end broadcastMessage
// Start the connection.
$.connection.hub.start().done(function () {
$(''#btnUpdate'').click(function () {
//call showNotification method on hub
notify.server.showNotification($.connection.hub.id, "TEST status");
});
});
});//End Main function
</script>
todo funciona hasta que quiero actualizar la página usando signalR. La función de notificación de show en mi hub es esta:
//hub function
public void showNotification(string connectionId, string newStatus){
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<notificationHub>();
string connection = "Your connection ID is : " + connectionId;//display for testing
string statusUpdate = "The current status of your request is: " + newStatus;//to be displayed
//for testing, you can display the connectionId in the broadcast message
context.Clients.Client(connectionId).broadcastMessage(connection + " " + statusUpdate);
}//end show notification
¿cómo puedo enviar el connectionid a mi servicio web?
Con suerte no estoy tratando de hacer algo imposible. Gracias por adelantado.
Cuando un cliente invoca una función del lado del servidor, puede recuperar su ID de conexión a través de Context.ConnectionId
. Ahora, si desea acceder a esa Id de conexión a través de un mecanismo fuera de un centro, podría:
- Simplemente haga que el Hub invoque su método externo pasando el ID de conexión.
- Administre una lista de clientes conectados también conocidos como
public static ConcurrentDictionary<string, MyUserType>...
agregando al diccionario enOnConnected
y eliminándolo deOnDisconnected
. Una vez que tenga su lista de usuarios, puede consultarla a través de su mecanismo externo.
Ej 1:
public class MyHub : Hub
{
public void AHubMethod(string message)
{
MyExternalSingleton.InvokeAMethod(Context.ConnectionId); // Send the current clients connection id to your external service
}
}
Ej 2:
public class MyHub : Hub
{
public static ConcurrentDictionary<string, MyUserType> MyUsers = new ConcurrentDictionary<string, MyUserType>();
public override Task OnConnected()
{
MyUsers.TryAdd(Context.ConnectionId, new MyUserType() { ConnectionId = Context.ConnectionId });
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
MyUserType garbage;
MyUsers.TryRemove(Context.ConnectionId, out garbage);
return base.OnDisconnected(stopCalled);
}
public void PushData(){
//Values is copy-on-read but Clients.Clients expects IList, hence ToList()
Clients.Clients(MyUsers.Keys.ToList()).ClientBoundEvent(data);
}
}
public class MyUserType
{
public string ConnectionId { get; set; }
// Can have whatever you want here
}
// Your external procedure then has access to all users via MyHub.MyUsers
¡Espero que esto ayude!
Debo diferir en la reconexión. El cliente permanece en la lista pero el connectid cambiará. Hago una actualización de la lista estática en las reconexiones para resolver esto.