我坚持认为WCF中一个基本且易于解决的问题,只需要以正确的方式引导。
我有一个大对象(实际上是一个训练有素的文本分类器),我需要通过C#.NET中的Web服务公开它。当服务最初启动时,可以从磁盘加载分类器对象,但我不想继续为每个请求从磁盘加载它(服务请求当前在内存中占用大约6 GB的对象,并且需要一段时间才能保留从每个请求的磁盘加载它,所以反而我希望在所有对该Web服务的请求中将该对象保留在内存中,并且该对象只应在服务启动时加载(而不是在第一个Web请求触发它时加载它)。
我将如何做到这一点?
感谢提供任何帮助!
答案 0 :(得分:5)
最简单的方法可能是将您的服务创建为singleton。这涉及在服务类定义的InstanceContextMode = InstanceContextMode.Single
属性中指定ServiceBehavior
。
但如果建议使用WCF通过线路发送6GB对象,则非常有问题。使用此方法可能会遇到各种服务可用性问题。
此外,单例在主机中不可扩展(每个主机只能有一个实例),尽管您可以托管多个单例服务,然后对请求进行负载平衡。
答案 1 :(得分:3)
我在过去遇到问题的项目中完成此操作的方法是在Windows服务中自托管WCF服务。
然后,我将数据存储对象设置为服务内部,作为在服务生命周期内持续存在的单例。每次WCF服务调用每次需要对数据执行某些操作时都会获取单例。
我会避免在IIS中运行,因为你没有直接控制服务的生命周期,因此没有足够的控制来处理和实例化事物。