0

如何使 WCF 服务器实例(.svc.cs / .svc.vb 文件中的类的实例)在请求之间保持活动状态?

这是一种无状态、只读的服务类型:我可以接受不同的客户端重用同一个实例。但是,它不是线程安全的:我不希望两个线程同时在这个实例上执行一个方法。

理想情况下,我正在寻找的是 WCF 管理这些实例的“工作池”。比如说,10. 新请求进来:获取一个实例,处理请求。请求结束,回到游泳池。已经有 10 个并发请求在运行?暂停 11 号,直到有新的工人空闲。

我/不/想要的是每个客户端的会话。这些实例的启动成本很高,我不想每次新客户端连接时都这样做。

我不想要的另一件事:处理这个客户端。这不是客户端的责任,它应该对服务器的实现一无所知。我不能总是控制它。

我对 MSDN 文档中不熟悉的术语有点迷失了。我有很多工作要做,但这个泳池系统我似乎无法正确。

我是否必须创建一个静态池并自己管理它?

谢谢

PS:让我感到困惑的是,这方面的几乎所有内容都指向绑定的配置。像 basicHttp 或 wsHttp。但这听起来不对:这应该在更高的层次上,与绑定无关:这是关于工人经理的。或不?

4

1 回答 1

0

如果您有一个集中业务逻辑的 WCF 服务,提供/控制对另一个“单一”后端资源(例如数据文件、网络套接字)的访问,或者包含某种类型的共享资源,那么您很可能需要实现一个单身人士。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

一般来说,如果它很好地映射到应用程序域中的自然单例,则使用单例对象。单例意味着单例具有一些您希望在多个客户端之间共享的有价值的状态。问题是当多个客户端连接到单例时,它们可能都在多个工作线程上同时进行。单例必须同步对其状态的访问以避免状态损坏。这反过来意味着一次只有一个客户端可以访问单例。这可能会降低响应性和可用性,以至于随着系统的增长,单例将无法使用。

单例服务是最终的可共享服务,它既有优点(如上所述)也有缺点(正如您的问题所暗示的,您必须管理线程安全)。当一个服务被配置为单例时,所有客户端都独立地连接到同一个已知实例,而不管它们连接到服务的哪个端点。单例服务永远存在,并且只有在主机关闭后才会被处理掉。单例在创建主机时只创建一次。

https://msdn.microsoft.com/en-us/magazine/cc163590.aspx

于 2015-03-06T16:00:23.220 回答