Come fa un server WCF informare un client WCF cambiamenti? (Soluzione migliore allora semplice polling, per esempio cometa o polling lungo)

StackOverflow https://stackoverflow.com/questions/1700917

Domanda

  

vedere anche " WCF spingere al cliente attraverso    firewall "

Ho bisogno di avere un client WCF che connettersi a un server WCF, poi quando alcuni dei dati modifiche sul server i clienti hanno bisogno di Aggiorna il suo display.

Poiché non v'è probabile che sia un firewall tra il client e il server.

  • Tutte le comunicazioni devono essere su HTTP
  • Il server non può fare una chiamata in uscita (fisica) al client.

Mentre sto scrivendo sia il client e il server non ho bisogno di limitare la soluzione solo con sapone ecc.


Cerco costruito nel surport per " polling lungo " / " Comet " etc


Grazie per la risposta più informativo da Drew Marsh su come implementare polling lungo in WCF. Comunque ho pensato che il principale “punto vendita” di WCF è che si potrebbe fare questo genere di cose semplicemente configurando i canali da utilizzare nel file di configurazione. per esempio Voglio un canale che logicamente a due vie ma fisicamente in entrata solo.

È stato utile?

Soluzione

Sembra a me come si conosce già la risposta: utilizzare polling lungo. :) Quindi credo che l'unica cosa che resta da spiegare è come si potrebbe essere in grado di raggiungere questo obiettivo con WCF e nel modo più efficiente possibile.


Le basi:

  1. In primo luogo, decidere per quanto tempo si desidera che ogni "lungo sondaggio" di essere. Per l'amor di discussione che ho intenzione di scegliere il timeout 5min.
  2. Sul lato client di associazione, modificare il sendTimeout="00:05:00".
  3. Proprio come l'utilizzo di XmlHttpRequest (XHR) per polling lungo, quando il timeout realtà non si verifica, è necessario rilevare e ristampare la prossima richiesta di polling. Questo è abbastanza facile in WCF perché non v'è una deroga specifica, TimeoutException , che si può prendere per rilevare facilmente questo era il problema contro qualche altra eccezione.
  4. A seconda di come si sta ospita il servizio WCF, è necessario fare in modo di configurare se stessi per consentire l'elaborazione per un massimo di 5 minuti. Dal punto di vista puro WCF si vuole fare in modo di impostare il receiveTimeout="00:05:00". Tuttavia, se si sta ospitando all'interno di ASP.NET sarà inoltre necessario configurare il runtime di ASP.NET per avere un timeout più elevato che viene fatto usando il <httpRuntime executionTimeout="300" /> ( Nota: le misure sono in secondi per questo attributo).

essere efficiente nel client

Se hai appena configurare il client di richiamare in modo sincrono il servizio ed i blocchi client per 5 minuti, mentre in attesa di una risposta, che non è un uso molto efficiente delle risorse di sistema. Si potrebbe mettere queste chiamate su sfondo discussioni, ma che è ancora in corso per masticare una risorsa filo mentre la chiamata è eccezionale. Il modo più efficace per affrontare questo è quello di utilizzare le operazioni asincrone.

Se si sta creando i vostri contratti di servizio a mano, vorrei suggerire check-out questa sezione su MSDN su OperationContractAttribute.AsyncPattern per i dettagli su come aggiungere un metodo asincrono coppia BeginXXX / EndXXX per ciascuna delle vostre chiamate. Tuttavia, se si sta utilizzando svcutil per generare i contratti di gestione per voi, tutto quello che dovete fare per avere metodi asincroni generati è passare l'opzione /async sulla riga di comando. Per ulteriori dettagli su questo argomento, check out il tema sincrone e asincrone su MSDN .

Ora che hai vanno le operazioni asincrone definiscono, il modello è molto simile a lavorare con XHR. Si chiama il metodo BeginXXX a cui si passa un AsyncCallback delegato . Il metodo BeginXXX si ritorna un IAsyncResult , che è possibile sia tenere su se si voleva essere in grado di aspettare sul funzionamento (in scenari più avanzati) o ignorare, e quindi l'infrastruttura WCF in modo asincrono inviare la richiesta al server e attendere una risposta dietro le quinte. Quando si riceve una risposta o si verifica un'eccezione, la richiamata avete passato nel metodo BeginXXX verrà richiamato. All'interno di questo metodo di callback è necessario chiamare il metodo EndXXX corrispondente passando l'IAsyncResult che viene consegnato a voi. Durante la chiamata al metodo EndXXX è necessario impiegare la gestione per affrontare qualsiasi tipo di guasto logico che possono essersi verificati durante la chiamata al metodo eccezione, ma questo è anche il luogo dove si sarebbe ora essere in grado di catturare l'TimeoutException abbiamo parlato in precedenza. Supponendo che hai una buona risposta, i dati saranno l'restituiti dal EndXXXchiamate e si può reagire a che i dati in qualsiasi modo abbia senso.

Nota: Una cosa da tenere a mente su questo modello è la natura della filettatura. I callback asincroni da WCF saranno ricevuti su un thread da il pool di thread gestito . Se avete intenzione di aggiornare l'interfaccia utente in una tecnologia come WPF o WinForms, è necessario assicurarsi che si effettua il marshalling le chiamate al thread UI utilizzando il Invoke o metodi BeginInvoke.

essere efficiente sul server

Se stiamo andando a essere preoccupati per l'efficienza nel client, dovremmo essere doppiamente così quando si tratta di server. Ovviamente questo tipo di approccio pone più la domanda sul lato server perché una connessione deve rimanere aperta e in attesa fino a quando c'è un motivo per inviare la notifica al client. La sfida qui è che solo si vuole legare il runtime WCF con l'elaborazione di quei clienti che sono effettivamente inviati un evento. Tutto il resto deve essere solo addormentato, in attesa che l'evento si verifichi. Per fortuna lo stesso modello asincrono abbiamo usato solo sul lato client funziona anche sul lato server. Tuttavia, v'è ora una grande differenza: ora si deve restituire il IAsyncResult (e quindi un WaitHandle ) dal metodo BeginXXX che il runtime WCF sarà poi l'ora di essere segnalato sulla prima di chiamare il metodo di EndXXX.

Si non trovare molto in termini di documentazione all'interno di MSDN altro che i link che ho già previsto in precedenza e, purtroppo, i loro campioni in scrittura di un async-service sono meno utili. Detto questo, Wenlong Dong ha scritto un pezzo su scala servizi WCF con il modello asincrono po 'di tempo fa, che vi raccomando caldamente di check-out.

Al di là di questo, io onestamente non posso dare troppi consigli sul modo migliore per attuare il modello asincrono sul lato server per voi bcause dipende interamente da che tipo di fonte di dati vostri eventi verranno da in primo luogo . File di I / O? Una coda di messaggi? Un database? Qualche altro software proprietario con un proprio servizio di messaggistica che si sta cercando di fornire una facciata finita? Non lo so, ma dovrebbero offrire tutta una modelli asincroni di loro su cui è possibile piggy back il proprio servizio per renderlo il più efficiente possibile.

Ricetta Aggiornato

Dal momento che questo sembra essere una risposta popolare, ho pensato che avrei dovuto tornare qui e fornire un aggiornamento dati i recenti cambiamenti nel paesaggio. A questo punto v'è ora una libreria .NET chiamato SignalR che fornisce questa funzionalità esatto ed è sicuramente il modo mi sento di raccomandare attuazione di tale comunicazione con il server.

Altri suggerimenti

Se il server potrebbe fare una connessione in uscita ad un bus di servizio che si potrebbe implament un tipo di chiamata indietro. In questo modo il client / server non avrebbe bisogno di conoscere l'un l'altro a tutti, solo l'affidamento servizio bus. Vedere NET Service Bus

Si vorrà guardare in WSDualHttpBinding

  

Il WSDualHttpBinding fornisce la   stesso supporto per i protocolli Web Service   come il WSHttpBinding, ma per l'uso con   contratti duplex. WSDualHttpBinding   supporta solo la sicurezza e SOAP   richiede messaggistica affidabile. Questo   binding richiede che il cliente ha una   URI pubblico che fornisce un callback   endpoint per il servizio. Questo è   fornito dal ClientBaseAddress. UN   doppio legame espone l'indirizzo IP   il client per il servizio. Il cliente   dovrebbe utilizzare la protezione per assicurare che   connette solo ai servizi che si fida.   

Anche se non WCF si potrebbe tentare di utilizzare XMPP per ottenere che la funzionalità in corso. C'è un articolo sulla InfoQ su di esso e altri sistemi. Mentre l'articolo afferma che XMPP non può essere utilizzato su HTTP, è possibile quando si utilizza BOSH .

Ci sono librerie .NET disponibili agsXMPP per citarne uno.

L'azienda dove lavoro sta iniziando a utilizzarla per spingere le notifiche di aggiornamento a una domanda di esso per aggiornare parti dell'interfaccia utente.

Google per " WCF duplex ". Ho usato questo con successo netTcpBinding (attraverso i continenti), ma non sono sicuro su basicHttpBinding.

Tuttavia, si richiede al server di richiamare al cliente. Se il server non è autorizzato a fare questo, polling può essere l'unica opzione ...

Se il server non può chiamare il cliente (e non dovrebbe in genere) si dovrebbe avere il polling client server come specificato. poiché avete WCF fondazione già in atto, basta aggiungere un'operazione per questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top