我编写了一个C# WebService。问题是,发布到IIS后,除非调用其任何方法,否则它不会自动启动。这非常令人沮丧,因为这个WebService必须在启动后立即执行一些后台工作(其构造函数执行)。如果重启IIS,WebService将一直处于空闲状态,直到调用其方法之一。有没有办法克服这个问题,并强制WebService在发布或IIS重新启动后立即执行其构造函数?
我编写了一个C# WebService。问题是,发布到IIS后,除非调用其任何方法,否则它不会自动启动。这非常令人沮丧,因为这个WebService必须在启动后立即执行一些后台工作(其构造函数执行)。如果重启IIS,WebService将一直处于空闲状态,直到调用其方法之一。有没有办法克服这个问题,并强制WebService在发布或IIS重新启动后立即执行其构造函数?
如果它必须在启动后持续执行一些后台工作,为什么不使用Windows服务来实现?我认为你可以编写一个WCF服务,并将其托管在Windows服务中。这样,客户端仍然可以调用您的服务,服务可以执行其后台工作,并且不会依赖于IIS作为主机,因为主机Windows服务将在自己的进程中运行。
w3wp.exe
用作通用服务主机,他们肯定会制作一个后台处理实用程序而不仅仅是一个预热实用程序。 - itowlsonActually, you can run a Thread or a job automatically in "Global.asax.cs". E.g.
public System.Threading.Thread schedulerThread = null;
protected void Application_Start(Object sender, EventArgs e)
{
schedulerThread = new System.Threading.Thread(YourLoopBackgroudMethodHere);
schedulerThread.Start();
}
And Don't forget to close the thread when your site application end.
protected void Application_End(Object sender, EventArgs e)
{
if (null != schedulerThread)
{
schedulerThread.Abort();
}
}
我同意其他人的观点,你应该使用Windows服务。如果你正在使用WCF,你可以很容易地将你的Web服务托管在Windows服务中,兼顾两者的优势。请参考这篇MSDN文章进行教程。
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。
我不同意。确保网络服务随计算机启动有很好的理由——允许它开始填充缓存或避免第一次执行缓慢。
IIS团队也支持这一点。这就是为什么他们开发了相应的功能:
http://www.iis.net/expand/ApplicationWarmUp
这个模块可以确保当IIS启动时,网站已经“热”了(也就是已经启动了)。