2012-10-04 11 views
6

Sono bloccato su quello che sono sicuro è un problema fondamentale e facile da risolvere in WCF, solo bisogno di essere guidato verso il modo giusto.Oggetto persistente in C#. NET Servizio Web

Ho un oggetto di grandi dimensioni (che in realtà è un classificatore di testo addestrato) che ho bisogno di esporre tramite un servizio Web in C# .NET. L'oggetto classificatore può essere caricato dal disco quando il servizio si avvia inizialmente, ma non voglio continuare a caricarlo dal disco per ogni richiesta (l'oggetto che le richieste di servizi occupa attualmente circa 6 GB in memoria, e ci vuole un po 'per mantenere caricandolo dal disco per ogni richiesta), quindi invece Voglio mantenere quell'oggetto in memoria per tutte le richieste a quel servizio web e l'oggetto deve essere caricato solo quando il servizio inizia (invece di caricarlo quando il primo richiesta web lo fa scattare).

Come potrei fare per farlo?

Grazie per qualsiasi aiuto!

+0

Avete intenzione di ospitare su IIS o nel vostro [ServiceHost] (http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehost.aspx)? – OffHeGoes

+0

IIS idealmente, ma sono facile se un'altra opzione ha più senso. – ToOsIK

+1

Beh, personalmente, userei IIS se dovessi esporre questo al mondo esterno, ma è più facile mantenere lo stato all'interno di un servizio Windows che espone un servizio Web utilizzando un ServiceHost. – OffHeGoes

risposta

5

Probabilmente il modo più semplice è creare il servizio come singleton. Ciò comporta la specifica di InstanceContextMode = InstanceContextMode.Single in un attributo ServiceBehavior nella definizione della classe di servizio.

Tuttavia si è molto discutibile se l'invio di un oggetto 6GB sopra il filo usando WCF è consigliabile. Con questo approccio puoi affrontare tutti i tipi di problemi di disponibilità del servizio.

Inoltre, i singleton non sono scalabili all'interno di un host (può essere solo un'istanza per host), sebbene sia possibile ospitare più servizi singleton e quindi bilanciare il carico delle richieste.

+0

Grazie per la risposta, in realtà non sto inviando l'oggetto 6GB ... tutto quello che devo fare è assicurarsi che questo oggetto sia caricato prima che qualsiasi richiesta arrivi al servizio web (così caricata nella fase di inizializzazione) e che tutte le richieste verrà servito usando questo oggetto (che ha una dimensione di circa 6 GB), invece di ogni richiesta che crea il proprio oggetto separato. Penso che tu abbia ragione e i servizi di Singleton sono la strada da percorrere! – ToOsIK

+0

@ToOsIK Probabilmente è una buona idea aggiornare la tua domanda. Sembrava che stavi cercando di inviare un oggetto da 6 GB tramite WCF. –

+1

Probabilmente avrai bisogno di auto hosting con ServiceHost per il tuo scenario. Vedi @hugh singleton link "Forse inizializzando la risorsa scarsa che gestisce il singleton impiega troppo tempo e non vorresti penalizzare il primo client." – OffHeGoes

3

Il modo in cui ho fatto questo nei progetti con cui ho avuto il problema in passato è di ospitare autonomamente il servizio WCF all'interno di un servizio di Windows.

Ho quindi impostato l'oggetto di archiviazione dati all'interno del servizio come un singleton che persiste per tutta la durata del servizio. Ogni chiamata di servizio WCF ottiene quindi il singleton ogni volta che è necessario fare qualcosa con i dati.

Eviterei di eseguire in IIS semplicemente perché non avete il controllo diretto della durata del servizio e quindi non abbiamo il controllo sufficiente di quando le cose sono disposte e istanziate.

+0

Sono d'accordo, ho avuto innumerevoli problemi con il controllo della disposizione di un servizio e la creazione di istanze, hai qualche letteratura sull'auto-hosting un servizio WCF all'interno di un servizio di Windows? – ToOsIK

+0

Microsoft ha una introduzione piuttosto decente nei propri [Come: Host di un servizio WCF in un'applicazione gestita] (http://msdn.microsoft.com/en-us/library/ms731 758.aspx) articolo; se fosse d'aiuto, aggiornerò anche la mia risposta con un po 'di codice. –

+0

grazie per la tua risposta e per avermi indirizzato verso l'approccio del servizio Win. Poiché la risposta di hugh è più adatta alla domanda che ho chiesto, ho accettato la sua come risposta corretta alla domanda, sebbene il tuo commento sia assolutamente necessario se voglio garantire la stabilità del mio servizio. Grazie! – ToOsIK

Problemi correlati