0

我有一个 WCF 服务,它使用字典来存储多个服务参数。该字典是通过解析保存在本地磁盘上的 XML 文件创建的。为了允许更新文件,FileSystemWatcher如果文件被更改,我想使用 a 来重新创建字典。

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

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

4

3 回答 3

2

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

于 2013-06-04T10:02:27.110 回答
1

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

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

于 2013-06-04T08:50:29.837 回答
0

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

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

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

于 2013-06-04T10:11:25.167 回答