2009-05-25 11 views
6

Ho un'applicazione client-server - in cui il server è essenzialmente un'applicazione Web ASP .NET e i client distribuiti sono applicazioni desktop.Il client (app per desktop) recupera dati ... ma voglio che il server (app Web) invii i dati

I client devono ricevere alcuni dati dal server - quando ci sono nuovi dati per il client. In questo momento, il modo in cui questo viene fatto è: il client continua a interrogare un servizio web ogni x minuti (diciamo 2 minuti) e continua a controllare se ci sono nuovi dati per il client.

Idealmente, il modo in cui dovrebbe funzionare è che l'app desktop debba ricevere gli aggiornamenti man mano che sono disponibili, non è necessario estrarre dal server; invece il server dovrebbe essere in grado di inviare al client.

Come faccio a fare questo - data l'architettura della soluzione - un'applicazione web ha bisogno di trasferire i dati alle applicazioni desktop (client) nella stessa rete (una LAN)?

risposta

7

Quello che stai descrivendo è "server push", che in questi giorni viene spesso chiamato "COMET". L'utilizzo di tali parole chiave in una ricerca sul Web dovrebbe generare molte informazioni utili.

La tecnica più comune per questo è denominata "GET sospeso". Il client invia una richiesta GET a un URL specifico e il server accetta la connessione ma ritarda l'invio di una risposta finché non ha i dati da inviare. Quando il client riceve la risposta, invia un altro GET quindi è pronto per un altro messaggio.

+1

Volevo semplicemente rilasciare una nota che puoi utilizzare IHttpAsyncHandler (http://msdn.microsoft.com/en-us/magazine/cc164128.aspx) e System.Threading.Monitor per creare facilmente una (sorta di) evento guidato "server push" in .NET 2.0 Se qualcuno conosce una classe di utilità completa per questo, si prega di postare alcuni collegamenti – Radu094

+0

Per ogni client il server deve mantenere attiva una connessione socket. Quindi non funzionerà quando il no. dei clienti non può essere previsto in anticipo. –

0

Se è possibile lasciare un socket aperto, il client può connettersi al server e il server può semplicemente trasferire i dati nello zoccolo quando appropriato. Non vi è alcun motivo per cui il lato che avvia la connessione deve essere sempre quello che avvia il trasferimento dei dati.

+0

Questa applicazione è per intranet generali nelle industrie. Utilizzando le connessioni socket, ad esempio utilizzando un socket, è necessario aprire una porta per l'accesso, riconfigurare il firewall, ecc. È un pre-requisito di installazione ragionevole o generalmente i clienti industriali si oppongono a questo? – Sameet

+0

Una connessione HTTP _è_ un socket. La risposta è (correttamente) consigliata è che il client invia un GET, ma il server ritarda l'invio di una risposta finché non ha i dati pronti per l'invio. –

+0

Sì, ma la connessione HTTP è sulla porta 80, che non è bloccata dai firewall? Quello che hai descritto sembra perfetto - il server che rimanda la risposta finché non ha i dati - come fare per farlo? – Sameet

2

È possibile utilizzare i richiami di WCF: si tratta di un servizio Web in cui è possibile abbonarsi alle notifiche da un client e il server invierà messaggi ai client sottoscritti. Ho un beginners guide sul mio blog.

+0

WCF? Quindi più che solo .NET 2.0? Purtroppo, .NET 2.0 è una limitazione che devo lavorare sotto? In questo caso i richiami di WCF saranno utili? – Sameet

+0

No, non temere, è solo WCF che ho paura. – blowdart

1

Potresti essere interessato allo SO question. Quello che stai descrivendo sembra un'applicazione Comet - server push a un client.

1

Check out WebSync; è una soluzione Comet per ASP.NET/IIS, ma è disponibile anche un client .NET completo, che consente l'integrazione con client di grandi dimensioni, servizi Windows, ecc. Quindi sembra che dovrebbe adattarsi al progetto in modo piuttosto gradevole.

Problemi correlati