2010-08-29 14 views
8

Ho un servizio WCF che deve leggere grandi (da 10 a 20 milioni) numeri di oggetti dal database.Streaming di un numero indeterminato di oggetti tramite WCF

Quello che mi piacerebbe fare è che il client apra un flusso e che il server spinga i dati dal database mentre sta leggendo.

Quindi il client può semplicemente sedersi in un ciclo di deserializzazione dei messaggi fino a quando non ottiene il messaggio EOF dal server, nello stile dell'API di streaming di Twitter, ma con un set finito. Il problema che sto avendo è come restituire lo stream e poi continuare a scrivere su di esso. È possibile con WCF?

risposta

2

In che modo invece di impostare un servizio di streaming/blocco si utilizza qualcosa come WS Dual Http. Con esso si ha un canale di callback bidirezionale asincrono che consente di richiedere/rispondere alle informazioni tra il server e il client. I problemi che si possono verificare se si desidera eseguire lo streaming dell'intero set è normale: alcune risorse potrebbero bloccare altre richieste (o un timeout) mentre altri utenti tentano di accedere al servizio.

+0

WS Dual Http non consente lo streaming. Ma in generale hai ragione. Probabilmente l'unico modo per simulare tale comunicazione in WCF è aprire la connessione Net.TCP in streaming bidirezionale (non è sicuro che questa combinazione sia possibile). Invece di restituire un singolo flusso, utilizzare la callback del client per inviare un set di dati. –

+0

Non ho detto che consentiva lo streaming. Sto cercando di dire che è probabilmente un'opzione migliore rispetto allo streaming. È possibile eseguire lo streaming in WCF, ma bloccherà l'I/O per le altre richieste in ingresso. Non è una buona scelta quando si tratta di ridimensionare. Inoltre, la maggior parte dei serializzatori incorporati vorranno che l'intero messaggio venga scaricato prima di iniziare la deserializzazione del contenuto. –

+0

Sarebbe meglio usare HttpHandler e scrivere nello stream in questo modo? Devo andare su HTTP in quanto si tratta di un servizio web esterno. Dai un'occhiata alla tua soluzione Matt e sembra bello, ma mi ero dimenticato di dire che potremmo avere persone che usano questo da WCF esterno, quindi immagino che dovrei seguire la rotta HttpHandler? Non sono necessariamente legato a WCF, mi chiedo solo se fosse possibile, quindi se ci sono altre opzioni migliori, sono certamente aperto a loro. Grazie per aver trovato il tempo di rispondere alla mia domanda tra. –

0

Il problema è che WCF non fornisce il flusso di risposta all'operazione. Lo stream restituito dall'operazione è solo un "contenuto" di alcuni messaggi. Ho provato a ingannare WCF con alcuni scenari di threading in cui ho restituito MemoryStream e ho provato a riempirlo da altri thread, ma come previsto non ha funzionato.

Menzionato HttpHandler è l'unico modo per andare.

0

Si potrebbe voler dare un'occhiata allo PollingDuplexHttpBinding (id avviso potrebbe potrebbe :-)).

Alcuni non sono molto appassionato di questa rilegatura ma non ho avuto troppi problemi con esso dopo l'ostacolo iniziale di ottenere la configurazione giusta.

Potrebbe sicuramente fare il lavoro che penso, dal momento che è poco più che il "lungo trucchetto" utilizzato nelle prese di rete come capisco.

HTH.

Problemi correlati