如何自动启动C#WebService?

时间:2010-03-24 08:06:39

标签: .net wcf web-services windows-services

我写了一个C#WebService。问题是,在我将其发布到IIS后,除非调用任何方法,否则它不会自动启动。这非常令人沮丧,因为这个WebService必须在它启动后立即继续做一些后台工作(它的构造函数执行)。如果IIS重新启动,WebService将只是闲置,直到调用其中一个方法。有没有办法克服这个问题并强制WebService在发布或重新启动IIS后立即执行其构造函数?

9 个答案:

答案 0 :(得分:10)

如果它必须在启动后立即继续执行一些后台工作,为什么不在 Windows服务中实现它?我认为您可以编写 WCF服务,它将托管在Windows服务中。这样客户端仍然可以调用您的服务,该服务可以执行其后台工作,并且不会依赖于IIS,因为主机窗口服务将在其自己的进程上运行。

答案 1 :(得分:4)

如果你需要它一直运行,你的设计是有缺陷的。改为创建一个Windows服务。

答案 2 :(得分:3)

我认为Web服务不是为了持续进行后台工作 - 它可以为其方法提供服务请求。

答案 3 :(得分:1)

您需要创建Windows服务。 Here是为计划任务创建Windows服务的步骤。

答案 4 :(得分:1)

除了(正确)评论之外,你应该使用Windows服务来处理需要在后台运行的东西:你能在global.asax中使用Application_Start事件吗?

答案 5 :(得分:1)

我同意其他人的意见,你应该使用Windows服务。如果您正在使用WCF,您可以轻松地在Windows服务中托管您的Web服务,并充分利用这两个世界。有关教程,请参阅此msdn article

答案 6 :(得分:1)

实际上,您可以在“Global.asax.cs”中自动运行线程或作业。例如。   

 public System.Threading.Thread schedulerThread = null;
 protected void Application_Start(Object sender, EventArgs e)
  {
    schedulerThread = new System.Threading.Thread(YourLoopBackgroudMethodHere);
    schedulerThread.Start();
  }
当站点应用程序结束时,不要忘记关闭该线程。

protected void Application_End(Object sender, EventArgs e)
  {
    if (null != schedulerThread)
    {
      schedulerThread.Abort();
    }
  }

答案 7 :(得分:0)

IIS 7.5通过扩展,IIS 7.5的应用程序初始化模块http://www.iis.net/downloads/microsoft/application-initialization支持此要求。

IIS 8.0具有内置支持:http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization

答案 8 :(得分:-1)

我不同意。有充分的理由确保从计算机启动Web服务 - 允许它开始填充它的缓存和/或简化以避免首次执行缓慢。

IIS团队和我在一起。这就是为什么他们为此开发了这样的东西:

http://www.iis.net/expand/ApplicationWarmUp

此模块可以确保IIS启动时网站“温暖”(如:启动)。