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

时间:2009-12-01 13:53:08

标签: c# .net wcf persistence

我编写了一个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();
}

4 个答案:

答案 0 :(得分:18)

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

在您的实施中尝试添加

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

这使服务基本上成为单身人士。

答案 1 :(得分:8)

您要做的是创建durable service

  

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

答案 2 :(得分:3)

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

但是,如果您只想在服务活动时调用WCF服务之间保持数据,那么在我看来,持久服务是过度的。使用静态数据是完全可以接受的这正是我在WCF项目中所做的。实际上,您显示的代码应该工作,所以此处还会发生其他事情。

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

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

答案 3 :(得分:-4)

添加:

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

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

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