2009-12-01 11 views
16

Ho scritto un servizio WCF, ma i dati memorizzati nell'implementazione del servizio non permangono tra le chiamate, nemmeno se sono memorizzate in una variabile statica. Cosa posso fare?Come scrivere un servizio WCF con memoria permanente in memoria?

L'implementazione del servizio è il seguente:

public class Storage : IStorage 
{ 
    protected static object[] _data; 

    #region IStorage Members 

    public void Insert(object[] data) 
    { 
     lock (_data) 
     { 
      _data = _data.Concat(data).ToArray(); 
     } 
    } 

    public object[] SelectAll() 
    { 
     lock (_data) 
     { 
      return (object[])_data.Clone(); 
     } 
    } 

    #endregion 
} 

Il servizio di accoglienza è un'applicazione console:

static void Main(string[] args) 
{ 
    ServiceHost serviceHost = 
     new ServiceHost(typeof(TimeSpanStorage)); 
    serviceHost.Open(); 
    Console.WriteLine("Service running. Please 'Enter' to exit..."); 
    Console.ReadLine(); 
} 

risposta

17

Per impostazione predefinita, l'istanza di WCF è impostata su Per chiamata, il che significa che i dati utilizzati nel servizio sono specifici per quel client per tale chiamata di metodo.

Sul implementazione prova ad aggiungere

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Single)] 
public class MyService: IService 

Questo rende il servizio essenzialmente un Singleton.

+1

L'impostazione della modalità di contesto su "Single" non è necessariamente la cosa giusta da fare, che non consente lo stato per transazione. L'uso di 'DurableOperation' è una scelta molto migliore. –

+0

Sono d'accordo che non permetterà al controllo transazionale di fare un servizio durevole. E il modello singleton ha i suoi limiti quando vuoi scalare. Il "dato ... non persiste tra le chiamate" mi ha fatto pensare che l'OP fosse dopo qualcosa di semplice. – MattC

+0

L'impostazione di InstanceContextMode su Single è un'idea orribile: la classe di servizio WCF ora è un singleton e l'utente ha serializzato la gestione di tutte le richieste (uccisione di qualsiasi prestazione) oppure è necessario gestire i problemi di multithreading (difficile e soggetto a errori). La scelta migliore sono servizi durevoli, che memorizzano semplicemente il loro stato in un archivio persistente (a.k.a. un database). –

8

Cosa stai cercando di fare è creare un durable service:

WCF I servizi durevoli sono servizi WCF in cui le operazioni possono ricordare i valori delle variabili private (= stato del servizio) tra riavvii del client serivcehost e/o .

+0

grazie per la risposta. Non ho trovato un'opzione di persistenza della memoria all'interno dei servizi durevoli. C'è qualche? O solo le opzioni di persistenza del database? –

+2

Link non sembra più indicare l'articolo originale –

+0

Vedere http: // msdn.microsoft.com/en-us/library/vstudio/bb628514(v=vs.90).aspx – Jono

3

Si desidera mantenere i dati oltre la durata dell'istanza ServiceHost? Se è così, sono d'accordo che un servizio duraturo ha un senso.

Tuttavia, se si desidera mantenere i dati tra chiamate al servizio WCF mentre il servizio è attivo, un servizio duraturo è eccessivo a mio modesto parere. L'uso di dati statici è perfettamente accettabile; è esattamente quello che faccio nel mio progetto WCF. Infatti, il codice che hai mostrato dovrebbe funzionare, quindi qualcos'altro sta succedendo qui.

Il metodo Main() è effettivamente come l'hai mostrato? Se è così, allora è un problema. Non appena viene avviata l'applicazione della console abilitata per WCF, si arresta immediatamente, portando con sé il servizio WCF. È necessario disporre di una logica in là per mantenere attiva l'applicazione console poiché il servizio WCF rimarrà solo "ospitato" mentre l'applicazione console è in esecuzione.

Se questo non è il problema, fammelo sapere, e aggiungerò il codice completo di una semplice applicazione che dimostra come farlo.

+0

Nessun metodo Main ha avuto una chiamata Console.ReadLine. La domanda è stata modificata per riflettere questo. –

+0

Cosa significa "while the service is alive"? Significa "mentre è in esecuzione l'applicazione della console host del servizio"? –

+2

@Jader Dias: Sì, se si desidera solo mantenere i dati mentre l'applicazione console 'ServiceHost' è in esecuzione, non c'è motivo di utilizzare l'approccio del servizio duraturo. L'approccio al servizio durevole funzionerà, ma anche l'approccio dei dati statici (di nuovo, questo è quello che sto usando nel mio progetto di servizio WCF). –

-4

Add:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 

Sopra la classe e avrete un servizio che è una singola istanza (vale a dire le proterties classe rimangono gli stessi) e consente a più connessioni simultanee.

Ora devi occuparti della tua proprietà di lettura/scrittura, ad esempio usa le serrature come hai già fatto (o qualche altra tecnica).

+3

risposta ripetuta –

Problemi correlati