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();
}
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. –
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
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). –