6

我坚持在 WCF 中确定是一个基本且易于解决的问题,只需要引导正确的方式。

我有一个需要通过 C# .NET 中的 Web 服务公开的大对象(实际上是经过训练的文本分类器)。分类器对象可以在服务初始启动时从磁盘加载,但我不想每次请求都从磁盘加载(服务请求的对象目前占用内存约 6 GB,需要一段时间才能保持为每个请求从磁盘加载它),所以我想在对该 Web 服务的所有请求中将该对象持久保存在内存中,并且该对象应该只在服务启动时加载(而不是在第一个 Web 请求触发它时加载它)。

我该怎么做呢?

感谢您的帮助!

4

2 回答 2

5

可能最简单的方法是将您的服务创建为单例。这涉及在您的服务类定义InstanceContextMode = InstanceContextMode.Single中指定一个ServiceBehavior属性。

但是,是否建议使用 WCF 通过线路发送 6GB 对象是非常值得怀疑的。使用这种方法,您可能会遇到各种服务可用性问题。

此外,单例在主机内是不可扩展的(每个主机只能有一个实例),尽管您可以托管多个单例服务,然后对请求进行负载平衡。

于 2012-10-04T09:33:46.667 回答
3

我在过去遇到问题的项目中这样做的方式是在 Windows 服务中自行托管 WCF 服务。

然后,我将服务内部的数据存储对象设置为在服务生命周期内持续存在的单例。然后,每个 WCF 服务调用在每次需要对数据执行某些操作时都会获取单例。

我会避免在 IIS 中运行,因为您无法直接控制服务的生命周期,因此无法充分控制何时处理和实例化事物。

于 2012-10-04T09:37:02.533 回答