2012-06-13 17 views
5

La domanda riguarda i dati statici in una classe.Il ciclo di vita del servizio WCF ospitato in IIS

Se si tratta di una classe di servizio, penso che la modalità di creazione di istanze sia importante. Ma cosa succede se ho un'altra classe singleton standalone?

Posso creare un oggetto lì che sarà disponibile per tutte le chiamate per chiamata? L'IIS ha quella DLL in memoria per sempre così che il singleton sarà sempre in memoria?

Come posso rendere qualche oggetto disponibile per tutte le chiamate client WCF? È possibile farlo in IIS o dovrei ospitare il servizio WCF in un servizio Windows?

risposta

2

Problema verificato nel mio IIS locale.

Questo è il mio codice.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service : IService 
{ 

    public static int _counter = 0; 

    public string GetData() 
    { 
     _counter++; 
     return _counter.ToString(); 
    } 
} 

Con la configurazione predefinita di IIS un processo viene eseguito per tirare applicazione e il codice funziona come previsto. Il risultato viene incrementato in ogni chiamata di servizio.

Questo ha senso perché InstanceContextMode non gestisce il threading. Controlla solo la durata di vita di InstanceContext.

Sapendo che non possiamo ancora considerare l'utilizzo di variabili statiche per dati mutabili come best practice. IIS potrebbe essere configurato come "Web Garden". Questa configurazione significa che è consentito più di un processo di lavoro per ogni pool di applicazioni e ogni processo avrà una propria copia di variabile statica.

http://www.iis.net/ConfigReference/system.applicationHost/applicationPools

Come posso fare qualche oggetto sia disponibile per tutte le chiamate client WCF? È possibile farlo in IIS o dovrei ospitare il servizio WCF in un servizio Windows ?

Gli oggetti devono essere archiviati in una memoria permanente come il database o la cache distribuita. IIS rimane ancora un ottimo host per i servizi e fornisce tutto ciò che il servizio Windows può fare e molto altro ancora.

2

fornirà alcuni suggerimenti basati sul breve contesto che hai fornito

  • Se si dispone di una classe statica, lo stato viene mantenuto fino a quando si ha accesso allo stesso proxy WCF. L'host (servizio IIS o Windows) non ha importanza.

  • Se si desidera mantenere "variabili statiche globali" tra le richieste dei client, perché non memorizzarle in un repository (file/database/ecc.)?

  • Se si desidera conservare lo stato per ogni richiesta client, è possibile provare i "Servizi WCF durevoli" (related thread). L'ho usato in precedenza, quindi funziona se il tuo scenario richiede un comportamento simile alla sessione ed è consapevole del costo delle prestazioni.

Spero che questo aiuti.

+0

Non capisco il primo punto (cosa intendete esattamente: lo stesso proxy wcf?) Il secondo punto, perché voglio caricare alcuni dati da db e servirlo ai client (la velocità è rilevante). Servizi durevoli d'altra parte, per quanto ne so utilizzano i cookie per memorizzare i dati di sessione del cliente. Quindi ospitare un wcf in un servizio Windows è la scelta giusta per andare? – John

+1

@John - Nel primo punto, per "proxy WCF", intendevo l'oggetto creato sul lato client per accedere al servizio. Quindi supponiamo che tu usi un solo proxy WCF per fare un numero di chiamate di servizio, la classe statica (sul lato server) rimarrebbe la stessa. Non consiglierei questo a meno che le chiamate di servizio non siano correlate. Riguardo alla tua seconda domanda, mi piace l'idea di utilizzare un servizio Windows per mantenere le variabili globali. Non l'ho usato prima, ma provalo. – Channs

+0

Capisco lo so. Grazie per il tuo suggerimento. – John

Problemi correlati