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

C# 在我的WCF服务启动时执行某些操作,c#,wcf,startup,C#,Wcf,Startup,我想在WCF服务启动后做点什么。你怎么能做到 事实上,我应该每10分钟更新一次服务变量。所以我把我的更新代码放在一个线程中。但我不知道在服务启动时如何启动此线程(WCF服务中是否有类似Form_Load事件的内容?很难在服务器上保持线程运行。一旦最后一个会话终止,应用程序就会关闭。一些主机提供商也会按计划回收应用程序池,这会扼杀任何保持线程运行的机会 除此之外,WCF服务实际上并不运行。它们的行为类似于由请求触发的网页。添加init代码的合适位置是在Global.asax中的应用程序\u Sta

我想在WCF服务启动后做点什么。你怎么能做到


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

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

除此之外,WCF服务实际上并不运行。它们的行为类似于由请求触发的网页。添加init代码的合适位置是在
Global.asax
中的
应用程序\u Start
。当应用程序启动时(发出第一个请求),会调用一次


如果您希望对服务的每个请求都做些什么,您可以在
Global.asax
中钩住
应用程序\u BeginRequest
事件

通常,WCF服务的任何部分都不会在内存中“闲逛”,随时准备做些什么。。。。WCF不是ASP.NET

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

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

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

  • 然后,该服务主机将查看已传入的请求,并根据目标URL决定实例化哪个服务类来处理该请求。然后创建服务类(您的服务实现),并调用和执行该服务类上的适当方法,一旦完成,服务类将被释放

因此,基本上,有两个要点可以让您了解:

  • 您可以创建自己的自定义
    ServiceHost
    类,当它被实例化时,该类将执行某些操作

  • 您可以向每个服务类方法添加一些“初始化”代码来处理您的需要


  • 您可以创建实例服务,该实例服务将在服务启动时调用构造函数:

    [服务合同]
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
    公共类InstanceService
    {
    私有整数_intValue;
    公共InstanceService()
    {
    _intValue=456;
    }
    [经营合同]
    公共int GetData()
    {
    返回_intValue;
    }
    }
    

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

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


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

    如何托管wcf服务?这样的单一服务实例有两个主要缺点:1)它要么序列化请求并逐个处理,造成潜在的巨大瓶颈;或者2)它需要完全支持多线程的编程,一点也不容易,而且很容易出错。如果可能的话,我会尽量避免使用单例。你说得对,我忘了说这只在非常特殊的情况下才有用,这不是一件容易考虑的事情。如果他在Windows服务或自托管应用程序中托管WCF怎么办?那里没有global.asax,从这个意义上讲,它不充当web应用程序。另外,WCF可能根本不使用会话。很好的一点是,它确实依赖于托管,我假设是网站,但这两者都可能是真的。那么其他类型的托管呢?这是特定于IIS的。例如,在Win服务托管中,OP可以创建一个计时器,并使用一个勾号事件来完成此操作。@oleksii:当您自己托管时,是的,您有更多的控制权,但仍然可以调整在您控制下实例化的服务主机,或者在服务方法中执行某些操作,当它被称为时,如果有人想在记忆中“闲逛”什么呢?