【问题标题】:WCF service and singletonsWCF 服务和单例
【发布时间】:2011-12-28 14:57:16
【问题描述】:

我有一个在 IIS 上运行的 WCF 服务。

每次用户登录(使用用户名和密码)时,我都会创建一个 SessionClass,它每隔几分钟在线程中执行一次操作并处理用户请求。

我将字典中创建的每个新 SessionClass 保存在单例 ServiceClass 中。

如果用户在很长一段时间内(比如 10 小时)没有请求任何内容,则会话应该终止。我杀死线程并从 ServiceClass 单例中的 Dictionary 中删除 SessionClass。

我的问题是,每次我从 Dictionary 中删除一个 SessionClass 时,它都会再次使 ServiceClass 的实例为空,而下一次调用它时,它又会被再次创建,所以我失去了以前在字典...

我尝试在 WCF 服务中直接引用 ServiceClass.GetInstance()(我认为垃圾收集器正在杀死 ServiceClass)但它无济于事......

为什么会这样?有什么想法吗?

【问题讨论】:

  • 阅读更多相关信息here

标签: c# wcf iis singleton


【解决方案1】:

将您的字典声明为静态字段。

至于为什么会出现这种情况,如果没有更多信息就无法说出,请发布一些代码。

更新
根据您的评论,听起来 IIS 正在回收 AppPool 和/或 AppDomain。无论哪种情况,您的 AppDomain 都会被卸载,因此存储在内存中的所有信息都将丢失。

Tess Ferrandez 写了一篇非常好的博文,讲述了 IIS 为何这样做here

更新 2
如果数据丢失只是不方便,您可以尝试将您的服务托管为managed windows service。托管 Windows 服务托管选项启用的方案是在非消息激活的安全环境中托管在 IIS 外部的长期运行 WCF 服务。服务的生命周期由操作系统控制。但是,如果您的数据永不丢失至关重要,则需要添加持久性机制(数据库、存储在磁盘上的文件中等)并从中读取/写入。

【讨论】:

  • 我将字典声明为静态,但它仍然没有帮助。这是课程:public class ServiceClass { private static ServiceManager _instance; private static Dictionary<Guid, SessionClass> _sessions = new Dictionary<Guid, SessionClass>(); private ServiceClass() { } public static ServiceClass GetInstance() { return _instance ?? (_instance = new ServiceClass()); } }
  • hemmm... 听起来像是原因。我为正在使用的 AppPool 更改了 IIS 上的回收设置。有什么方法可以确保 AppPool 永远不会回收?如果不是 - 我有什么选择?如何确保不丢失信息?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
相关资源
最近更新 更多