我一直在坚持WCF中的一个基本的,容易解决的问题,只需要以正确的方式引导。C#.NET Web服务中的持久对象
我有一个大的对象(实际上是一个训练有素的文本分类器),我需要通过C#.NET中的Web服务公开。当服务最初启动时,分类器对象可以从磁盘加载,但是我不想为每个请求从磁盘继续加载它(服务请求的对象当前在内存中占用大约6 GB,并且需要一段时间为每个请求从磁盘加载它),所以而不是我想要在该服务启动(而不是加载它的第一个网络请求触发它)。
我该怎么做呢?
谢谢的任何帮助!
我一直在坚持WCF中的一个基本的,容易解决的问题,只需要以正确的方式引导。C#.NET Web服务中的持久对象
我有一个大的对象(实际上是一个训练有素的文本分类器),我需要通过C#.NET中的Web服务公开。当服务最初启动时,分类器对象可以从磁盘加载,但是我不想为每个请求从磁盘继续加载它(服务请求的对象当前在内存中占用大约6 GB,并且需要一段时间为每个请求从磁盘加载它),所以而不是我想要在该服务启动(而不是加载它的第一个网络请求触发它)。
我该怎么做呢?
谢谢的任何帮助!
可能最简单的方法是将您的服务创建为singleton。这涉及在您的服务类定义的ServiceBehavior
属性中指定InstanceContextMode = InstanceContextMode.Single
。
然而如果在使用WCF是最好的电线发送一个6GB的对象是非常怀疑。用这种方法可以解决各种服务可用性问题。
此外,单身人士在主机内不可伸缩(每个主机只能有一个实例),尽管您可以托管多个单身服务,然后负载平衡请求。
感谢您的回复hugh,我实际上并没有发送6GB对象......我需要做的就是确保此对象在任何请求到达Web服务(在初始化阶段加载)之前加载,并且所有请求将使用这个对象(大小约6GB)进行服务,而不是每个请求都创建自己的单独对象。我认为你是正确的,Singleton服务是要走的路! – ToOsIK
@ToOsIK大概是一个好主意来更新你的问题。它看起来像你试图通过WCF发送一个6GB的对象。 –
您可能需要使用ServiceHost自行托管您的方案。请参阅@hugh singleton link“也许初始化单身管理的稀缺资源需要太多时间,并且您不希望惩罚第一个客户。“ – OffHeGoes
我在过去遇到过问题的项目中完成此项工作的方式是自行承载Windows Service中的WCF服务。
然后,我已经将服务中的数据存储对象设置为服务生命周期中的单例。每次WCF服务调用都会在每次需要对数据执行操作时获取单例。
我会避免在IIS中运行,因为你没有直接控制服务的生命周期,因此没有足够的控制权来处理和实例化事物。
您打算在IIS上或在您自己的[ServiceHost](http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehost.aspx)上托管吗? – OffHeGoes
理想情况下IIS,但如果另一种选择更有意义,则很容易。 – ToOsIK
好吧,我个人会使用IIS,如果我打算将它公开给外部世界,但是更容易在使用ServiceHost公开Web服务的Windows服务中维护状态。 – OffHeGoes