我想在整个WCF服务库中初始化和使用。如果它在ASP.NET站点中,我将在global.asax的Application_Start方法中执行它,但是什么是WCF服务库的等价物?
我使用一个静态单例,我懒惰初始化我持有所有应用程序状态,每次我都这样做时感觉很糟糕。
您可以创建会话WCF组件。
请参阅我对此问题的回答:Sessionful wcf service in Silverlight
您甚至可以创建持久的会话对象,在它们断开连接后保留其状态(将其保存到文件或SQL Server)。 Juval Lowy的书的第4章也详细介绍了这一点。
那是你要找的那种吗?
我现在仍然在使用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
我非常确定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服务,则这些都不适用。