WCF服务和单身人士

时间:2011-11-14 12:24:59

标签: c# wcf iis singleton

我在IIS上运行了WCF服务。

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

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

如果用户长时间没有请求任何内容(比方说10个小时),会话就会死亡。我杀了线程并从ServiceClass单例中的Dictionary中删除了SessionClass。

我的问题是每次我从Dictionary中删除一个SessionClass时,它会再次使ServiceClass的实例为null,并且在下次调用它时,它会再次被创建,所以我丢失了我曾经保存的所有会话字典...

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

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

1 个答案:

答案 0 :(得分:1)

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

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

<强>更新
根据您的评论,听起来IIS正在重新命名AppPool和/或AppDomain。在任何一种情况下都会卸载AppDomain,因此存储在内存中的所有信息都将丢失。

Tess Ferrandez撰写了一篇非常好的博客文章,介绍了IIS为什么会这样做here

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