首页  ·  知识 ·  编程语言
Asp.Net自动运行
天佑  CSDN博客  .NET  编辑:天佑   图片来源:网络
项目发布以后,假如想要一个可以自动执行的程序在后台运行,比如每隔1分钟去扫描数据库发送邮件,这样的需求经常见,在ASP.NET中我们可以采取两种方法实现。

项目发布以后,假如想要一个可以自动执行的程序在后台运行,比如每隔1分钟去扫描数据库发送邮件,这样的需求经常见,在ASP.NET中我们可以采取两种方法实现。

一、在项目的Global.asax文件中添加自动执行程序。

        我们可以在Application_Start方法中添加自动运行的代码,当Web程序一旦发布以后,改代码就可以自动运行了。实例代码如下:

<%@ Application Language="C#" %>

<script RunAt="server">

    void Application_Start(object sender, EventArgs e)

    {

        // Code that runs on application startup

        // 加载网站设置

        OThinker.H3.WorkSheet.SheetUtility.EnsureSettings(this.Application);

        //定义定时器

        System.Timers.Timer myTimer = new System.Timers.Timer(60000); //设置时间为1分钟

        myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);

        myTimer.Enabled = true;

        myTimer.AutoReset = true;

        myTimer.Start();

    }

    //每隔1分钟读取H3数据库中待发送的短信列表 发送短信 更新状态值

    static void myTimer_Elapsed(object source, System.Timers.ElapsedEventArgs e)

    {

        try

        {

            string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["H3"].ToString();

            System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(strconn);

            System.Data.DataSet ds = new System.Data.DataSet();

            try

            {

                connection.Open();

                string sqlStr = "SELECT ID,Number,Message FROM SMS_SendMessage WHERE State=0";

                System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand(sqlStr, connection);

                System.Data.SqlClient.SqlDataAdapter command = new System.Data.SqlClient.SqlDataAdapter(sqlCommand);

                command.Fill(ds);

                if (ds != null && ds.Tables[0].Columns.Count > 0)

                {

                    foreach (System.Data.DataRow dr in ds.Tables[0].Rows)

                    {

                        //设置短信提醒URL

                        string sendMessageUrl = string.Format("http://office.zhongnangroup.cn:87/pmoa/commondoc/commonphoneinterface.jsp?phone={0}&content={1}&type={2}",

                            dr["Number"].ToString(), HttpUtility.UrlEncode(dr["Message"].ToString(), Encoding.GetEncoding("GB2312")), "bpm");

                        System.Net.WebRequest request = System.Net.WebRequest.Create(sendMessageUrl);//发送request

                        System.Net.WebResponse response = request.GetResponse();//获取返回结果

                        System.IO.Stream resStream = response.GetResponseStream();

                        System.IO.StreamReader sr = new System.IO.StreamReader(resStream, Encoding.Default);

                        StringBuilder sb = new StringBuilder();

                        string r = string.Empty;

                        while ((r = sr.ReadLine()) != null)

                        {

                            sb.Append(r);

                        }

                        r = sb.ToString();

                        resStream.Close();

                        sr.Close();

                        if (r == "true")//发送短信成功 更新状态值

                        {

                            string updateSql = "UPDATE SMS_SendMessage SET State=1,SendTime=getdate() WHERE ID='" + dr["ID"].ToString() + "'";

                            System.Data.SqlClient.SqlCommand sqlUpdateCommand = new System.Data.SqlClient.SqlCommand(updateSql, connection);

                            sqlUpdateCommand.ExecuteNonQuery();

                        }

                    }

                }

            }

            catch (System.Data.SqlClient.SqlException ex)

            {

                throw new Exception(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

        catch (Exception ee)

        {

            throw ee;

        }

    }

    void Application_End(object sender, EventArgs e)

    {

        //Code that runs on application shutdown

        //解决IIS应用程序池自动回收的问题

        System.Threading.Thread.Sleep(1000);

        //激发Application_Start

        string url = "http://www.baidu.com/";

        System.Net.HttpWebRequest myHttpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);

        System.Net.HttpWebResponse myHttpWebResponse = (System.Net.HttpWebResponse)myHttpWebRequest.GetResponse();

        System.IO.Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流

    }

    void Application_Error(object sender, EventArgs e)

    {

        // Code that runs when an unhandled error occurs

    }

    void Session_Start(object sender, EventArgs e)

    {

        // Code that runs when a new session is started

    }

    void Session_End(object sender, EventArgs e)

    {

        // Code that runs when a session ends. 

        // Note: The Session_End event is raised only when the sessionstate mode

        // is set to InProc in the Web.config file. If session mode is set to StateServer 

        // or SQLServer, the event is not raised.

    }

</script>

这种方法的缺点很明显,就是程序运行到一定时间后会自动停止,必须在Application_End方法中激活一下。

二、开发一个windows服务,后台驻留。我觉得这种方法是最灵活也是最好的。

1、在项目中添加一个windows服务项目。

2、打开设计器然后切换到代码界面,实例代码如下:

namespace MessageService

{

    public partial class SendService : ServiceBase

    {

        public SendService()

        {

            InitializeComponent();

        }

        protected override void OnStart(string[] args)

        {

            WriteLog("Service Started");

            //定义定时器

            System.Timers.Timer myTimer = new System.Timers.Timer(60000); //设置时间间隔为1分钟

            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);

            myTimer.Enabled = true;

            myTimer.AutoReset = true;

            myTimer.Start();

        }

        //每隔1分钟读取H3数据库中待发送的短信列表 发送短信 更新状态值

        protected void myTimer_Elapsed(object source, System.Timers.ElapsedEventArgs e)

        {

            try

            {

                string strconn = "Data Source=10.10.19.230;Initial Catalog=H3;Persist Security Info=True;User ID=sa;password=password123456;";

                SqlConnection connection = new SqlConnection(strconn);

                DataSet ds = new DataSet();

                try

                {

                    connection.Open();

                    string sqlStr = "SELECT ID,Number,Message FROM SMS_SendMessage WHERE State=0";

                    SqlCommand sqlCommand = new SqlCommand(sqlStr, connection);

                    SqlDataAdapter command = new SqlDataAdapter(sqlCommand);

                    command.Fill(ds);

                    if (ds != null && ds.Tables[0].Columns.Count > 0)

                    {

                        foreach (DataRow dr in ds.Tables[0].Rows)

                        {

                            //设置短信提醒URL

                            string sendMessageUrl = string.Format("http://office.zhongnangroup.cn:87/pmoa/commondoc/commonphoneinterface.jsp?phone={0}&content={1}&type={2}",

                                dr["Number"].ToString(), HttpUtility.UrlEncode(dr["Message"].ToString(), Encoding.GetEncoding("GB2312")), "bpm");

                            WebRequest request = WebRequest.Create(sendMessageUrl);//发送request

                            request.Timeout = 10000;//设置超时时间

                            WebResponse response = request.GetResponse();//获取返回结果

                            Stream resStream = response.GetResponseStream();

                            StreamReader sr = new StreamReader(resStream, Encoding.Default);

                            StringBuilder sb = new StringBuilder();

                            string r = string.Empty;

                            while ((r = sr.ReadLine()) != null)

                            {

                                sb.Append(r);

                            }

                            r = sb.ToString();

                            resStream.Close();

                            sr.Close();

                            if (r == "true")//发送短信成功 更新状态值

                            {

                                string updateSql = "UPDATE SMS_SendMessage SET State=1,SendTime=getdate() WHERE ID='" + dr["ID"].ToString() + "'";

                                SqlCommand sqlUpdateCommand = new SqlCommand(updateSql, connection);

                                sqlUpdateCommand.ExecuteNonQuery();

                                WriteLog("Send Successfully. MessageID: " + dr["ID"].ToString());

                            }

                            else

                            {

                                WriteLog("Send Failed. MessageID: " + dr["ID"].ToString());

                            }

                        }

                    }

                }

                catch (SqlException ex)

                {

                    WriteLog(ex.Message);

                }

                finally

                {

                    connection.Close();

                }

            }

            catch (Exception ee)

            {

                WriteLog(ee.Message);

            }

        }

        protected override void OnStop()

        {

            WriteLog("Service Stop");

        }

        private void WriteLog(string content)

        {

            FileStream fs = new FileStream(@"c:\MessageService.txt", FileMode.OpenOrCreate, FileAccess.Write);

            StreamWriter m_streamWriter = new StreamWriter(fs);

            m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);

            StringBuilder sb = new StringBuilder();

            sb.Append("MessageService: ");

            sb.Append(content);

            sb.Append(" " + DateTime.Now.ToString() + "\n");

            m_streamWriter.WriteLine(sb.ToString());

            m_streamWriter.Flush();

            m_streamWriter.Close();

            fs.Close();

        }

    }

}

3、打开设计器视图,右键单击,添加安装程序,然后设置 服务的启动类型和名称等等属性。

 4、生成服务程序,拷贝服务exe文件,然后使用 安装工具 InstallUtil.exe工具安装服务。命令行如下:

        InstallUtil  f:\MessageService.exe   安装服务

       InstallUtil  -u  f:\MessageService    卸载服务


本文作者:天佑 来源:CSDN博客
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的