2011-08-30 17 views
5

Voglio fare qualcosa subito dopo l'avvio del servizio WCF. Come può farlo?Esegui qualcosa all'avvio del servizio WCF

Infatti, dovrei aggiornare alcune variabili del mio servizio ogni 10 minuti. Così ho inserito il mio codice di aggiornamento in una discussione. Ma non so come avviare questo thread all'avvio del servizio (C'è qualcosa che è piaciuto evento Form_Load nei servizi WCF?)

+1

Come si ospita il servizio wcf? – Jan

risposta

2

È difficile mantenere un thread in esecuzione su un server. Non appena termina l'ultima sessione, l'applicazione si arresta. Alcuni provider di hosting riciclano anche il pool di app in un programma che elimina ogni possibilità di mantenere un thread in esecuzione.

A parte questo, i servizi WCF non vengono effettivamente eseguiti. Si comportano come pagine web attivate da una richiesta. La posizione ragionevole per aggiungere il codice di inizializzazione sarebbe nel tuo Application_Start in Global.asax. Questo verrebbe richiamato una volta all'avvio dell'applicazione (viene effettuata la prima richiesta).

Se si preferisce fare qualcosa su ciascuna richiesta ai propri servizi, è possibile collegare l'evento Application_BeginRequest anche in Global.asax.

+0

'Global.asax'? ;) – Marc

+0

@Marc: P - fixed – TheCodeKing

+0

Cosa succede se ospita WCF in un servizio di Windows o in un'applicazione auto-ospitata? Non c'è global.asax lì e non agisce come un'applicazione web in questo senso. Inoltre, WCF potrebbe non utilizzare affatto le sessioni. – oleksii

5

In genere non ci sono parti del servizio WCF che "si aggirano" in memoria, pronte a fare qualcosa .... WCF è NON ASP.NET!

Il setup di default quando si ospita in IIS è questo:

  • IIS in ascolto su una specifica porta/URL per la richiesta - non c'è una sola traccia del vostro servizio WCF ovunque in memoria

  • quando una prima richiesta arriverà, IIS creerà un ServiceHost - una classe che può "ospitare" un servizio

  • questo host di servizi esaminerà quindi la richiesta è arrivata e in base all'URL di destinazione, sarà decidibile e quale classe di servizio istanziare per gestire questa richiesta. La classe di servizio (l'implementazione di servizi) viene creato e il metodo appropriato in quella classe di servizio viene richiamato ed eseguito, e una volta che è completato, la classe di servizio è disposto

Quindi, in pratica, ci sono due punti in cui si può agganciarsi:

  1. è possibile creare il proprio personalizzato ServiceHost classe che farà qualcosa quando viene creata un'istanza

  2. è possibile aggiungere un po 'di codice "di inizializzazione" per ciascuna della vostra classe di servizio metho DS per gestire le vostre esigenze

+1

E altri tipi di hosting? Questo è specifico di IIS. Ad esempio, nel servizio di hosting Win, OP può creare un timer e utilizzare un evento tick per farlo. – oleksii

+0

@oleksii: quando si auto-host, sì, si ha un po 'più di controllo - ma ancora - in pratica si può modificare l'host del servizio che viene istanziato sotto il proprio controllo, o si fa qualcosa nel metodo di servizio, quando si chiama –

+0

Cosa dovrebbe qualcuno fare allora se vogliono qualcosa "semplicemente in giro" in memoria? – AjaxLeung

0

È possibile creare un servizio di istanziato, che chiamerà il costruttore al momento l'inizio del servizio:

[ServiceContract] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class InstanceService 
{ 
    private int _intValue; 

    public InstanceService() 
    { 
     _intValue = 456; 
    } 

    [OperationContract] 
    public int GetData() 
    { 
     return _intValue; 
    } 
} 

Invocare GetData() su questo servizio restituirà un intero con un valore di 456.

+3

Tale istanza di servizio singleton ha due principali svantaggi: 1) serializza le richieste e le gestisce una dopo l'altra, creando un collo di bottiglia potenzialmente enorme - o 2) richiede una programmazione pienamente multi-threading, qualcosa che non è affatto semplice e abbastanza incline a errori. Cercherei di evitare singleton quando possibile –

+0

Hai ragione, ho dimenticato di dire che questo sarà utile solo in situazioni molto specifiche, e non è qualcosa che dovrebbe essere considerato facilmente. – CodeCaster

0

Questo può essere ottenuto se si è in grado di controllare come ospitarlo. Se è possibile, ospitare il servizio WCF come servizio Windows o un eseguibile ad hoc. Quindi puoi ottenere ciò che vuoi con facilità.Se sei legato all'hosting di IIS devi farlo come altri hanno suggerito e gestirlo per richiesta.

Leggi su wcf self-hosting se IIS non è richiesto.