将字典保存在WCF服务的内存中

时间:2013-06-04 08:30:16

标签: c# wcf

我有一个WCF服务,它使用字典表示多个服务参数。通过解析保存在本地磁盘上的XML文件来创建此字典。为了允许更新文件,我想使用FileSystemWatcher以便在文件被打开时重新创建字典。

我将此机制用于其他事情,我也希望在服务中使用它。我的问题是,根据我的理解,WCF为每个请求创建一个服务类的实例(我知道这是可配置的,但我们使用每个请求),并且我想将字典保存在它将保留的位置实例完成为请求提供服务后的内存。

这可以完成吗?在哪里放置逻辑解析XML文件和存储字典的最佳位置?

3 个答案:

答案 0 :(得分:2)

您可以使用ConfigurationSection创建自定义配置部分以将XML内容存储在Web.config文件中,您只需从配置文件中读取即可。框架会为您缓存配置值。此外,您不需要使用此方法的文件观察程序。如果您“触摸”Web.config,将自动为您重新启动应用程序,并将新值读入缓存。

答案 1 :(得分:1)

您可以将字典存储在静态成员中,并在静态构造函数中或懒惰地初始化它。

如果您的服务托管在iis中,请记住,iis将处理主机进程的生命周期,这可能意味着在重新创建应用程序域时将重新加载您的字典。

答案 2 :(得分:0)

首先我假设你正在使用字典类,根据msdn: 只要未修改集合,Dictionary就可以同时支持多个读取器。即便如此,通过集合枚举本质上不是一个线程安全的过程。在枚举与写访问争用的极少数情况下,必须在整个枚举期间锁定该集合。要允许多个线程访问集合以进行读写,您必须实现自己的同步。

有关线程安全的替代方法,请参阅ConcurrentDictionary。

其次,您可以构造一个单独的类来包装Dictionary,因此只会为处理多个请求的app域实例化一个字典实例。构建单例的方法有很多,选择哪种实现取决于你的使用模式,请谷歌C#和单例从多种选择中选择一种。