在WCF服务库项目中设置和存储应用程序状态的位置?

时间:2010-01-15 03:04:15

标签: .net wcf unity-container

我想在整个WCF服务库中初始化和使用。如果它在ASP.NET站点中,我将在global.asax的Application_Start方法中进行,但是什么是WCF服务库的等价物?

4 个答案:

答案 0 :(得分:3)

我使用一个静态单例,我懒惰地初始化我保持所有应用状态的地方,每次我都这样做时感觉很糟糕。

答案 1 :(得分:2)

您可以创建会话WCF组件。

请参阅我对此问题的回复:Sessionful wcf service in Silverlight

您甚至可以创建持久的会话对象,在它们断开连接后保留其状态(将其保存到文件或SQL Server)。 Juval Lowy的书的第4章也详细介绍了这一点。

这就是你要找的东西吗?

答案 2 :(得分:1)

我现在仍然在使用WCF处于学习模式,但我认为实际执行此操作的最优雅方法是定义自己的类(es)来保存状态并让它们实现IExtension接口。

请参阅此文章以获取概述: http://blogs.msdn.com/b/drnick/archive/2007/02/15/stashing-data-in-extensible-objects.aspx

这个涉及计时器的非常聪明的用法: http://social.msdn.microsoft.com/Forums/vstudio/en-US/2793580f-b91a-4d4d-b98f-b7dcab70710a/wcf-periodic-methods-call-multithread

答案 3 :(得分:0)

我很确定IIS上的WCF实际上是ASP.NET的专业化。它不会替代ASP.NET,而是对其进行了扩展。因此,您的WCF服务项目也可以包含ASP.NET内容-.aspx文件旁边的.asax.svc文件。因此,应该有可能在您的WCF项目中只使用 Global.asax,并使用常规的Application_Start方法。值得牢记的是,ASP.NET应用程序在应用程序池启动时初始化,在应用程序池停止时崩溃。因此,Application_Start会在第一个请求暖到应用程序池的请求到来之前运行,然后,如果应用程序池闲置了足够长的时间,IIS将对其进行处理,并在下一个创建一个请求进入时,就会得到自己的Application_Start事件。

我刚刚对此进行了明确的测试,可以确认Global的事件确实在运行。通过加载Application_Start页和加载其元数据视图的.aspx页来触发.svc。奇怪的是,ASP.NET创建了两个Global的单独实例。第一个实例仅接收Application_Start事件,而第二个实例接收所有其他事件。

如果您不使用IIS来承载WCF服务,那么这都不适用。