Wie schreibe ich einen WCF-Dienst mit permanenter Speicherung im Arbeitsspeicher?

Ich habe einen WCF-Dienst geschrieben, aber die in der Dienstimplementierung gespeicherten Daten bleiben zwischen den Aufrufen nicht erhalten, auch nicht in einer statischen Variablen. Was kann ich machen?

Die Service-Implementierung sieht wie folgt aus:

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 } 

Der Diensthost ist eine Konsolenanwendung:

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

Standardmäßig ist WCF instanceMode auf Per Aufruf gesetzt. Dies bedeutet, dass die im Dienst verwendeten Daten für diesen Client für diesen Methodenaufruf spezifisch sind.

Bei Ihrer Implementierung versuchen Sie das Hinzufügen

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

Dies macht den Dienst im Wesentlichen zu einem Einzelgänger.

Sie möchten einen dauerhaften Service erstellen:

WCF-Dauerhafte Dienste sind WCF-Dienste, bei denen sich die Operationen die Werte privater Variablen (= Status des Dienstes) zwischen Neustarts des serivcehost und / oder des Clients merken können.

Möchten Sie die Daten über die Lebensdauer Ihrer ServiceHost Instanz hinaus ServiceHost ? Wenn ja, stimme ich zu, dass ein dauerhafter Service sinnvoll ist.

Wenn Sie jedoch nur die Daten zwischen Anrufen Ihres WCF-Dienstes beibehalten möchten, während der Dienst aktiv ist , ist ein dauerhafter Dienst meiner bescheidenen Meinung nach zu viel. Die Verwendung statischer Daten ist absolut akzeptabel. Genau das mache ich in meinem WCF-Projekt. In der Tat sollte der von Ihnen gezeigte Code funktionieren, also läuft hier etwas anderes.

Ist die Main() -Methode tatsächlich so, wie Sie sie gezeigt haben? Wenn ja, dann ist das ein Problem. Sobald Ihre WCF-fähige Konsolenanwendung gestartet wird, wird sie sofort heruntergefahren und der WCF-Dienst wird mitgenommen. Sie müssen über eine Logik verfügen, um die Konsolenanwendung am Leben zu erhalten, da der WCF-Dienst nur “gehostet” bleibt, während die Konsolenanwendung ausgeführt wird.

Wenn dies nicht das Problem ist, lass es mich wissen, und ich füge den vollständigen Code einer einfachen Anwendung hinzu, die zeigt, wie das geht.

Hinzufügen:

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

Oberhalb Ihrer class haben Sie einen Dienst, der eine einzelne Instanz ist (dh die classnprotokolle bleiben gleich) und ermöglicht mehrere gleichzeitige Verbindungen.

Nun müssen Sie sich um das Lesen / Schreiben Ihrer Eigenschaft kümmern, dh Sperren verwenden, wie Sie es bereits getan haben (oder eine andere Technik).