【问题标题】:Persist object in C# .NET Web Service在 C# .NET Web 服务中持久化对象
【发布时间】:2012-10-04 09:20:20
【问题描述】:

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

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

我该怎么做呢?

感谢提供任何帮助!

【问题讨论】:

  • 您打算在 IIS 上托管,还是在您自己的 ServiceHost 上托管?
  • IIS 是理想的,但如果另一个选项更有意义,那就容​​易了。
  • 好吧,就个人而言,如果我要向外界公开它,我会使用 IIS,但在使用 ServiceHost 公开 Web 服务的 Windows 服务中维护状态会更容易。

标签: c# .net wcf web-services


【解决方案1】:

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

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

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

【讨论】:

  • 感谢休的回复,我实际上并没有发送 6GB 对象...我需要做的就是确保在任何请求到达 Web 服务之前加载该对象(因此在初始化时加载阶段),并且所有请求都将使用这个对象(大小约为 6GB)来处理,而不是每个请求都创建自己的单独对象。我认为你是正确的,单例服务是要走的路!
  • @ToOsIK 更新您的问题可能是个好主意。看起来您确实试图通过 WCF 发送一个 6GB 的对象。
  • 您可能需要为您的场景使用 ServiceHost 自行托管。请参阅@hugh 单例链接“也许初始化单例管理的稀缺资源需要太多时间,而您不想惩罚第一个客户端。”
  • @OffHeGoes 我认为你是对的,按照 comish 的建议,我必须通过自托管方法和单例类方法才能使其正常工作。
  • @ToOsIK 是的,我认为这就是答案。我也可能想省略 Singleton WCF 的东西,而是自己编组访问 6GB 超级对象(静态,线程安全)。这样将来我可以扩展它并在内存中拥有多个 6GB 对象(如果服务器可以满足它!)。
【解决方案2】:

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

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

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

【讨论】:

  • 我同意,我在控制服务的处置和实例化方面遇到了无数问题,您是否有任何关于在 Windows 服务中自托管 WCF 服务的文献?
  • 微软在他们的How to: Host a WCF Service in a Managed Application 文章中有相当不错的介绍;如果有帮助,我还会用一些代码更新我的答案。
  • 感谢您的回答,并为我指出了 Win Service 方法。由于休的回答更适合我提出的问题,因此我接受了他作为该问题的正确答案,尽管如果我想确保服务的稳定性,您的评论是绝对必要的。谢谢!
  • 不客气 - 我完全同意(事实上,我自己投票赞成 Hugh 的回答!)
猜你喜欢
  • 2016-11-14
  • 2010-12-18
  • 1970-01-01
  • 2017-08-02
  • 2011-09-12
  • 2013-07-03
  • 1970-01-01
  • 2015-06-17
  • 2011-11-13
相关资源
最近更新 更多