2012-10-04 50 views
6

我一直在坚持WCF中的一个基本的,容易解决的问题,只需要以正确的方式引导。C#.NET Web服务中的持久对象

我有一个大的对象(实际上是一个训练有素的文本分类器),我需要通过C#.NET中的Web服务公开。当服务最初启动时,分类器对象可以从磁盘加载,但是我不想为每个请求从磁盘继续加载它(服务请求的对象当前在内存中占用大约6 GB,并且需要一段时间为每个请求从磁盘加载它),所以而不是我想要在该服务启动(而不是加载它的第一个网络请求触发它)。

我该怎么做呢?

谢谢的任何帮助!

+0

您打算在IIS上或在您自己的[ServiceHost](http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehost.aspx)上托管吗? – OffHeGoes

+0

理想情况下IIS,但如果另一种选择更有意义,则很容易。 – ToOsIK

+1

好吧,我个人会使用IIS,如果我打算将它公开给外部世界,但是更容易在使用ServiceHost公开Web服务的Windows服务中维护状态。 – OffHeGoes

回答

5

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

然而如果在使用WCF是最好的电线发送一个6GB的对象是非常怀疑。用这种方法可以解决各种服务可用性问题。

此外,单身人士在主机内不可伸缩(每个主机只能有一个实例),尽管您可以托管多个单身服务,然后负载平衡请求。

+0

感谢您的回复hugh,我实际上并没有发送6GB对象......我需要做的就是确保此对象在任何请求到达Web服务(在初始化阶段加载)之前加载,并且所有请求将使用这个对象(大小约6GB)进行服务,而不是每个请求都创建自己的单独对象。我认为你是正确的,Singleton服务是要走的路! – ToOsIK

+0

@ToOsIK大概是一个好主意来更新你的问题。它看起来像你试图通过WCF发送一个6GB的对象。 –

+1

您可能需要使用ServiceHost自行托管您的方案。请参阅@hugh singleton link“也许初始化单身管理的稀缺资源需要太多时间,并且您不希望惩罚第一个客户。“ – OffHeGoes

3

我在过去遇到过问题的项目中完成此项工作的方式是自行承载Windows Service中的WCF服务。

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

我会避免在IIS中运行,因为你没有直接控制服务的生命周期,因此没有足够的控制权来处理和实例化事物。

+0

我同意,我在控制服务的处置和实例方面遇到了无数问题,您是否有任何关于自托管的文献Windows服务中的WCF服务? – ToOsIK

+0

Microsoft在其[如何在托管应用程序中托管WCF服务]中有相当不错的介绍(http://msdn.microsoft.com/zh-cn/library/ms731 758.aspx)文章;如果它有帮助,我也会用一些代码更新我的答案。 –

+0

感谢您的回答,并指引我使用Win服务方法。由于休的答案更符合我问的问题,我接受了他作为问题的正确答案,尽管如果我想确保服务的稳定性,您的评论是绝对必要的。谢谢! – ToOsIK