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