C'è un modo per escludere un client da una chiamata in Clients.method SignalR?
-
26-10-2019 - |
Domanda
Sto valutando SignalR (che sembra essere usato con Knockoutjs) per vedere se siamo in grado di usarlo per informare i clienti di problemi di concorrenza. Fondamentalmente utente "a" salva un record e gli utenti "b, c, d, e, f, g" sono notificati. Io fondamentalmente ho un esempio di lavoro che notifica tutti i clienti. Quindi penso che io sono quasi.
mi sono imbattuto in questo link e mi portano sulla strada attuale che ho sono on. Sono stato anche guardando la documentazione sul Github .
In sostanza voglio escludere la un singolo client dalla chiamata Clients.method()
. Non vedo un modo per scorrere i clienti e controllare il ClientId. L'unico altro posso vedere per raggiungere questo obiettivo è quello di guardare forse a usare i gruppi per tenere traccia di esso, ma che sembrava un po 'ingombrante, ma ho avuto problemi con quello.
public class TicketHub : Hub
{
static int TotalTickets = 10;
public void GetTicketCount()
{
AddToGroup("ticketClients");
Clients.setTicketCount(TotalTickets);
}
public void BuyTicket()
{
if (TotalTickets > 0)
TotalTickets -= 1;
RemoveFromGroup("ticketClients");
// This will call the method ONLY on the calling client
// Caller.updateTicketCountWithNotification(TotalTickets);
// This will call the method on ALL clients in the group
Clients["ticketClients"].updateTicketCountNotify(TotalTickets);
AddToGroup("ticketClients");
Caller.updateTicketCountDontNotify(TotalTickets);
}
}
Soluzione
codice JavaScript:
<script type="text/javascript">
$(document).ready(function () {
var test = $.connection.test;
$("#btnTest").click(function () {
test.testMethod();
});
test.show = function (text, guid) {
if (guid != test.guid) //notify all clients except the caller
alert(text);
};
$.connection.hub.start(function () { test.start(); });
});
</script>
Classe:
public class Test : Hub
{
public void Start()
{
Caller.guid = Guid.NewGuid();
}
public void TestMethod()
{
Clients.show("test", Caller.guid);
}
}
Altri suggerimenti
Se si vuole escludere il chiamante dalla chiamata al metodo lato client è possibile utilizzare:
Clients.Others.clientSideMethod();
C'è anche Clients.AllExcept (...) che permette di escludere certe persone.