Avevo scritto un sistema di "chat / notifica" basato sulla WCF, ma sto mettendo in dubbio la mia decisione se WCF è un buon compromesso.
Ho una libreria di terze parti esterna che chiama il mio processo quando arrivano gli eventi:
public class Service
{
ScreenPopService _service;
public void Start()
{
MyThirdPartyImports.RegisterUpdate(CallEvent);
// currently i am doing this with WCF, getting weirdness with singleton
// loosing member state on each call
_service = new ScreenPopService();
var host = new ServiceHost(service);
}
void CallEvent(uint pbxh, string info)
{
// do something and communicate this to the connected clients
// which currently is running in the WCF service. loosing state
// when i call in to _service here
// this loops through connected clients and calls them back via the
// OperationContext.Current.GetCallbackChannel<IScreenPopCallback>();
_service.WeNeedToNotifyClients(info);
}
}
Questo deve essere collegato al servizio WCF che a sua volta chiama i client. I client eseguono il login e saranno autorizzati o meno (a seconda dell'impostazione del limite massimo di utenti sul server).
Ora vedo due problemi con la mia decisione di usare WCF:
-
Alcune delle principali stranezze che coinvolgono ambiti / vite che non riesco a risolvere ... in pratica il mio stato membro interno del servizio, incluso l'elenco dei callback dei client connessi (quindi posso richiamarli!) si perde in ogni chiamata di servizio quando eseguo l'auto-host . Posso aggirarlo avendo un riferimento statico all'interno del WcfService a un oggetto nell'app della console di hosting, ma questo mi odora.
-
Se richiamo un client tramite il canale di callback non è asincrono e potrebbe bloccarsi, specialmente se devo scorrere un elenco di client connessi uno alla volta e richiamarli potrebbe bloccarsi fino al timeout.
Ora sto riconsiderando a scrivere tutto usando i socket TCP e anche se mi avvicino alla coalface, perdo la freddezza della WCF nell'invio di messaggi attraverso la rete.
-
.NET consente un modo semplice per inviare oggetti attraverso il cavo esattamente come fa WCF? Se questo fosse eseguito su un flusso TCP, avrei bisogno di inquadrare ogni "pacchetto" in modo da sapere dove iniziano e finiscono i dati per l'oggetto?
-
In primo luogo userò thick client (app di Windows) ma in futuro potrò usare client basati su javascript. Qualunque altro framework (ho sentito parlare di SignalR dovrà ora analizzare questo aspetto) che le persone possono raccomandare per la messaggistica?
-
Ho preso in considerazione un bus eventi, ma non sono sicuro di come funzionerebbe dato che voglio avere un limite sul numero di client che possono connettersi in qualsiasi momento (per le licenze).