我有一个 WCF 服务,它使用basicHttpBinding
. 该服务充当分布在多台机器(称为客户端)上的其他服务的控制器。
该服务配置为Single
ContextMode
使用Multiple
ConurrecnyMode
. 这样它就会保持对象的状态。我的问题是在一段时间不活动后,我看到服务再次调用构造函数,因此它失去了所有状态!有什么建议可以让这项服务永远存在吗?
谢谢!
我有一个 WCF 服务,它使用basicHttpBinding
. 该服务充当分布在多台机器(称为客户端)上的其他服务的控制器。
该服务配置为Single
ContextMode
使用Multiple
ConurrecnyMode
. 这样它就会保持对象的状态。我的问题是在一段时间不活动后,我看到服务再次调用构造函数,因此它失去了所有状态!有什么建议可以让这项服务永远存在吗?
谢谢!
听起来 IIS 正在回收您的服务。请记住这一点(摘自 Internet Information Services Hosting Best Practices):
IIS 宿主环境针对不在内存中维护本地状态的服务进行了优化。IIS 回收主机进程以响应各种外部和内部事件,导致专门存储在内存中的任何易失性状态丢失。托管在 IIS 中的服务应将其状态存储在进程外部(例如,在数据库中)或内存缓存中,如果发生应用程序回收事件,可以轻松地重新创建该缓存。
虽然可以禁用回收,但如果您需要托管 IIS 并且您关心状态,您可能应该将它放在一个持久的位置。
默认情况下,IIS 每 29 小时回收一次应用程序池。
为避免这种情况,您可以转到应用程序池回收设置并取消选中此选项。
这仍然不能保证 100% 的状态持久性,因为 IIS 可以重新启动,应用程序池可以在 web.config 更改时回收等。如果状态对您很重要,您可能希望将状态持久化而不是依赖于数据库而不是依赖在内存上。
另一个要考虑的选择是将服务托管在 Windows 服务而不是 IIS 中。