如何使用内存中持久存储编写WCF服务?

我编写了一个WCF服务,但存储在Service实现中的数据在调用之间不会持续存在,即使存储在静态变量中也是如此。 我能做什么?

服务实现如下:

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 } 

服务主机是控制台应用程序:

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

默认情况下,WCF instanceMode设置为Per call,这意味着服务中使用的数据特定于该方法调用的客户端。

在您的实现尝试添加

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

这使得服务基本上是单身。

您要做的是创建一个持久的服务 :

WCF持久服务是WCF服务,其中操作可以记住在serivcehost和/或客户端重新启动之间的私有变量(=服务状态)的值。

您是否希望在ServiceHost实例的生命周期之后保留数据? 如果是这样,那么我同意耐用的服务是有道理的。

但是,如果您只想在服务处于活动状态时在 WCF服务的调用之间保持数据,那么在我的拙见中,持久服务是过度的。 使用静态数据是完全可以接受的 这正是我在WCF项目中所做的。 事实上,你所展示的代码应该可以工作,所以这里还有别的东西。

Main()方法实际上就像你展示的一样吗? 如果是这样,那就是一个问题。 启动WCF的控制台应用程序启动后,会立即关闭,并使用WCF服务。 您需要在其中具有一些逻辑以使控制台应用程序保持活动状态,因为在控制台应用程序运行时,WCF服务将仅保持“托管”状态。

如果这不是问题,请告诉我,我将添加一个简单应用程序的完整代码,演示如何执行此操作。

加:

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

在您的课程之上,您将拥有一个单一实例的服务(即类保护保持不变),并允许多个并发连接。

现在你必须处理你的属性读/写,即使用你已经完成的锁(或其他一些技术)。