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

本文关键字:保存 存在 内存 字典 WCF 服务 | 更新日期: 2023-09-27 18:16:44

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

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

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

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

您可以创建自定义配置节来将XML内容存储在Web中。使用ConfigurationSection配置文件,您可以简单地从配置文件中读取。框架为您缓存配置值。此外,使用这种方法也不需要文件监视器。如果你"触摸"网络。配置后,应用程序会自动重新启动,新的值会被读入缓存。

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

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

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

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

其次,你可以构造一个单例类来包装字典,这样一个处理多个请求的应用程序域只会实例化字典的一个实例。有很多方法可以构造单例,选择哪种实现取决于你的使用模式,请谷歌c#和单例从众多替代方案中选择一个。