Risposte:
Da quello che vedo nella sezione Connessione e Hub sembra che Hub fornisca un sistema di argomenti che sovrappone le connessioni persistenti di livello inferiore.
Dal commento altamente votato di seguito:
Parzialmente corretto. È possibile ottenere argomenti o gruppi anche in connessioni persistenti. La grande differenza è l'invio di diversi tipi di messaggi. Ad esempio, hai diversi tipi di messaggi e desideri inviare diversi tipi di payload. Con connessioni persistenti devi incorporare il tipo di messaggio nel payload (vedi esempio Raw) ma gli hub ti danno la possibilità di eseguire RPC su una connessione (ti consente di chiamare metodi sul client dal server e dal server al client) . Un'altra cosa importante è l'associazione dei modelli. Gli hub consentono di passare parametri fortemente tipizzati ai metodi.
L'esempio utilizzato nella documentazione utilizza una metafora della chat room, in cui gli utenti possono entrare in una room specifica e quindi ricevere messaggi da altri utenti nella stessa room. Più genericamente il tuo codice si abbona a un argomento e quindi ottiene solo i messaggi pubblicati su quell'argomento. Con le connessioni persistenti otterrai tutti i messaggi.
Potresti facilmente costruire il tuo sistema di argomenti in cima alle connessioni persistenti, ma in questo caso il team SignalR ha già fatto il lavoro per te.
La differenza principale è che non è possibile eseguire RPC con PersistentConnection, è possibile inviare solo dati non elaborati. Quindi, invece di inviare messaggi dal server in questo modo
Clients.All.addNewMessageToPage(name, message);
dovresti inviare un oggetto con Connection.Broadcast()
o Connection.Send()
e quindi il cliente dovrebbe decidere cosa farne. Ad esempio, potresti inviare un oggetto come questo:
Connection.Broadcast(new {
method: "addNewMessageToPage",
name: "Albert",
message: "Hello"
});
E sul client, anziché semplicemente definire
yourHub.client.addNewMessageToPage = function(name, message) {
// things and stuff
};
dovresti aggiungere un callback per gestire tutti i messaggi in arrivo:
function addNewMessageToPage(name, message) {
// things and stuff
}
connection.received(function (data) {
var method = data.method;
window[method](data.name, data.message);
});
Dovresti fare lo stesso tipo di invio sul lato server nel OnReceived
metodo. Dovresti anche deserializzare la stringa di dati lì invece di ricevere gli oggetti fortemente tipizzati come fai con i metodi hub.
Non ci sono molti motivi per scegliere PersistentConnection su Hub. Uno dei motivi per cui sono a conoscenza è che è possibile inviare JSON pre-serializzato tramite PersistentConnection, cosa che non è possibile eseguire utilizzando gli hub. In alcune situazioni, questo potrebbe essere un vantaggio prestazionale rilevante.
A parte questo, vedi questa citazione dalla documentazione :
Scelta di un modello di comunicazione
La maggior parte delle applicazioni dovrebbe utilizzare l'API Hubs. L'API di Connections potrebbe essere utilizzata nelle seguenti circostanze:
È necessario specificare il formato del messaggio effettivo inviato.
Lo sviluppatore preferisce lavorare con un modello di messaggistica e invio piuttosto che con un modello di chiamata remoto.
- Un'applicazione esistente che utilizza un modello di messaggistica viene trasferita per utilizzare SignalR.
A seconda della struttura del messaggio, è possibile ottenere anche piccoli vantaggi dall'uso di PersistentConnection.
Potresti dare un'occhiata ai campioni SignalR, in particolare qui.
Esistono due modi per usare SignalR: puoi accedervi a un livello basso sovrascrivendo la sua PersistentConnection
classe, che ti dà molto controllo su di esso; oppure puoi fare in modo che SignalR faccia tutto il lavoro pesante per te, usando gli "Hub" di alto livello.
Ci sono tre punti principali da considerare quando si confrontano questi due:
Con hub la formattazione dei messaggi viene sostanzialmente gestita da te, ma con connessioni persistenti il messaggio è grezzo ed è stato tokenizzato e analizzato avanti e indietro. Se la dimensione del messaggio è importante, si noti inoltre che il payload di una connessione persistente è molto inferiore a quello di un hub.
Per quanto riguarda il modello di comunicazione, le connessioni persistenti hanno sostanzialmente una funzione per l'invio e la ricezione di messaggi mentre gli hub accettano un modello di chiamata di procedura remota con funzione unica per requisito.
Quando si tratta di personalizzazione poiché le connessioni persistenti sono di livello più basso, possono offrire un maggiore controllo sulla personalizzazione.