在我的WCF服务启动时执行某些操作

时间:2011-08-30 20:22:43

标签: c# wcf startup

我希望在我的WCF服务启动后做一些事情。怎么办?

事实上,我应该每10分钟更新一次我的服务变量。所以我把我的更新代码放在一个线程中。但我不知道在服务启动时如何启动此线程(在WCF服务中是否有任何类似的Form_Load事件?)

4 个答案:

答案 0 :(得分:5)

您的WCF服务通常没有任何部分“只是闲逛”在内存中准备做某事...... WCF ASP.NET!

在IIS中托管时的默认设置是:

  • IIS侦听请求的特定端口/ URL - 内存中没有任何WCF服务跟踪

  • 当第一个请求进入时,IIS将启动ServiceHost - 一个可以“托管”服务的类

  • 然后,此服务主机将查看请求已进入并根据目标URL,它将决定实例化哪个服务类来处理此请求。然后创建服务类(您的服务实现)并调用并执行该服务类上的相应方法,一旦完成,就会处理服务类

所以基本上,你有两点可以挂钩:

  1. 您可以创建自己的自定义ServiceHost类,在实例化时执行某些操作

  2. 您可以为每个服务类方法添加一些“初始化”代码以满足您的需求

答案 1 :(得分:2)

很难让线程在服务器上运行。一旦最后一个会话终止,应用程序就会关闭。一些托管服务提供商还按计划回收应用程序池,这会阻止任何保持线程运行的机会。

除此之外,WCF服务实际上并没有运行。它们就像请求触发的网页一样。添加初始化代码的合理位置将在Application_Start Global.asax中。当应用程序启动时(第一个请求发出),这将被调用一次。

如果您希望对服务的每个请求执行某些操作,则可以在Application_BeginRequest中挂钩Global.asax事件。

答案 2 :(得分:0)

您可以创建一个实例化服务,它将在您启动服务时调用构造函数:

[ServiceContract]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class InstanceService
{
    private int _intValue;

    public InstanceService()
    {
        _intValue = 456;
    }

    [OperationContract]
    public int GetData()
    {
        return _intValue;
    }
}

在此服务上调用GetData()将返回一个值为456的整数。

答案 3 :(得分:0)

如果您能够控制如何托管此功能,则可以实现此目的。如果可以,请将WCF服务作为Windows服务或临时可执行文件托管。然后,您可以轻松实现您想要的。如果您被绑定到IIS主机,则必须按照其他人的建议进行操作并按照请求处理它。

如果不需要IIS,请阅读自托管wcf。