我做了一个自动发送邮件的功能,使用Timer计时器来监测,想用间隔一段时间自动执行,利用global.asax后台执行,自动生成Excel,并发送至指定邮箱。发现发布至IIS后不自动执行,根本就没有进去Timer事件中去。
解决办法:发布到IIS后需要对所发布的网站进行浏览,这样才会启动Global.aspx,才会执行Timer监听事件。
protected void Application_Start(Object sender, EventArgs e)
{
System.Timers.Timer myTimer = new System.Timers.Timer(60000 * 5);//设计时间间隔,如果10分钟执行一次就为60000*10
myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);
myTimer.AutoReset = true;
myTimer.Enabled = true;
}
protected void Application_End(Object sender, EventArgs e)
{
//下面的代码是关键,可解决IIS应用程序池自动回收的问题
Thread.Sleep(1000);
//这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start
string url = "http://www.baidu.com";
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流
}
说明:IIS应用程序池会自动回收,回收后将不在执行Global.aspx中的事件,回收时间是1740分钟(我的是1740m),Application_End中如上可以解决IIS自动回收问题,通过Create url激发Application_Start 。但是这样仍然不能够解决IIS重启或者服务器重启的问题,发生这种情况时只要有人访问该网站就可以启动Application_Start 。