我坚持在WCF中确定是一个基本且易于解决的问题,只需要被引导到正确的方向。
我有一个大型对象(实际上是一个经过训练的文本分类器),我需要通过 C# .NET 中的 Web 服务公开它。分类器对象可以在服务最初启动时从磁盘加载,但我不想为每个请求继续从磁盘加载它(服务请求的对象当前占用大约 6 GB 的内存,并且需要一段时间才能为每个请求从磁盘加载它),所以我想在对该 Web 服务的所有请求中将该对象保留在内存中, 并且对象应仅在服务启动时加载(而不是在第一个 Web 请求触发它时加载它)。
我该怎么做呢?
感谢您的任何帮助!
最简单的方法可能是将服务创建为单一实例。这涉及在服务类定义的 ServiceBehavior
属性中指定InstanceContextMode = InstanceContextMode.Single
。
但是,是否建议使用 WCF 通过网络发送 6GB 对象是非常值得怀疑的。使用此方法可能会遇到各种服务可用性问题。
此外,单一实例在主机中不可缩放(每个主机只能是一个实例),尽管您可以托管多个单一实例服务,然后对请求进行负载均衡。
我在过去遇到问题的项目中执行此操作的方法是在 Windows 服务中自承载 WCF 服务。
然后,我将服务内的数据存储对象设置为在服务生命周期内持续存在的单一实例。然后,每次需要对数据执行某些操作时,每个 WCF 服务调用都会获取单一实例。
我会避免在 IIS 中运行,因为您不能直接控制服务的生存期,因此对何时释放和实例化事物没有足够的控制。