为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

C# Windows服务 定时执行访问数据库循环发送手机短信

2018-02-10 7页 doc 23KB 109阅读

用户头像

is_977556

暂无简介

举报
C# Windows服务 定时执行访问数据库循环发送手机短信C# Windows服务 定时执行访问数据库循环发送手机短信 WindowsC#C++C应用服务器 文章来源:chrome://newtab/ 所谓Windows后台服务,即后台自动运行的程序,一般随操作系统启动而启动,在我的电脑 服务后应用程序 服务里面能看到当前电脑的服务.一般而言,程序上用VC、C++写Windows服务,但是我对这些语言不是很熟,一般编程用C#较多,所以就用C#语言写了一个Windows服务. 其实需求是这样的,做那个报价系统的时候加入了发短信的功能,订单处理完即将发货的时候要发送短信都客户手机...
C# Windows服务 定时执行访问数据库循环发送手机短信
C# Windows服务 定时执行访问数据库循环发送手机短信 WindowsC#C++C应用服务器 文章来源:chrome://newtab/ 所谓Windows后台服务,即后台自动运行的程序,一般随操作系统启动而启动,在我的电脑 服务后应用程序 服务里面能看到当前电脑的服务.一般而言,程序上用VC、C++写Windows服务,但是我对这些语言不是很熟,一般编程用C#较多,所以就用C#语言写了一个Windows服务. 其实需求是这样的,做那个报价系统的时候加入了发短信的功能,订单处理完即将发货的时候要发送短信都客户手机上,公司内部员工处理订单超时要自动发短信,群发产品促销信息到客户手机上等,还有定时发送短信的需求,所以最后面决定把发短信的模块独立出来,以后还有什么功能方便一起调用,而最终选择了采用Windows后台服务. 其实Windows服务并不好做到通用,它并不能在用户的界面显示一些什么信息等,它只是在后台默默的处理一些事情,起着辅助的作用.那如何实现发送段信通用调用的接口呢?它们之间的信息又是如何来交互呢?数据库!对,就是它存储数据信息的.而数据库都能很方便的访问操作.把发送短信的后台服务定时去访问一个数据库,而另外任何要发送短信的地方也访问数据库,并插入一条要发送的短信到里面,稍后Windows后台服务访问该表将此短信发送出去.这可能是一个比较蠢的方法,但实现起来较简单. 首先,由于它是要安装的,所以它运行的时候就需要一个安装类Installer将服务安装到计算机,新建一个后台服务安装类继承自Installer,安装初始化的时候是以容器进行安装的,所以还要建立ServiceProcessInstaller和ServiceInstaller服务信息组件添加到容器安装,在Installer类增加如下代码: private System.ComponentModel.IContainer components = null; private System.ServiceProcess.ServiceProcessInstaller spInstaller; private System.ServiceProcess.ServiceInstaller sInstaller; private void InitializeComponent() { components = new System.ComponentModel.Container(); // 创建ServiceProcessInstaller对象和ServiceInstaller对象 this.spInstaller = new System.ServiceProcess.ServiceProcessInstaller(); this.sInstaller = new System.ServiceProcess.ServiceInstaller(); // 设定ServiceProcessInstaller对象的帐号、用户名和密码等信息 this.spInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem; this.spInstaller.Username = null; this.spInstaller.Password = null; // 设定服务名称 this.sInstaller.ServiceName = "SendMessage"; sInstaller.DisplayName = "发送短信服务"; sInstaller.Description = "一个定时发送短信的服务"; // 设定服务的启动方式 this.sInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic; this.Installers.AddRange(new System.Configuration.Install.Installer[] { this.spInstaller, this.sInstaller }); } 再添加一个服务类继承自ServiceBase,我们可以重写基类的OnStart、 OnPause、OnStop、OnContinue等方法来实现我们需要的功能并设置指定一些属性.由于是定事发送短信的服务,自然少不了Windows记时器,在OnStart事件里我们写入服务日志,并初始化记时器. private System.Timers.Timer time; private static readonly string CurrentPath = Application.StartupPath + "\\"; protected override void OnStart(string[] args) { string path = CurrentPath + "Log\\start-stop.log"; FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine("The Service is Starting On " + DateTime.Now.ToString()); sw.Flush(); sw.Close(); fs.Close(); time = new System.Timers.Timer(1000 * Convert.ToInt32(GetSettings("TimeSpan"))); time.Enabled = true; time.Elapsed += this.TimeOut; time.Start(); } 实例化记时器类启动后,将在指定时间间隔触发Elapsed指定事件,如上 GetSettings为读取我App.config文件里一个配置节点(值为30)的方法,所以上 面将会每隔30秒调用TimeOut方法.而改方法就是我们发短信的具体操作.代码 如下: private void TimeOut(object sender, EventArgs e) { try { if (GetSettings("Enabled").ToLower() == "true") { SqlConnection con = new SqlConnection(GetSettings("ConnString")); SqlCommand cmd = new SqlCommand("select [sysid],[admin_inner_code],[user_inner_code],[phone],[message],[sendt ime] from [tbl_note_outbox]", con); con.Open(); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { string phone = rdr["phone"].ToString(); string message = rdr["message"].ToString(); string sendtime = rdr["sendtime"].ToString(); System.Text.Encoding encoder = System.Text.Encoding.GetEncoding("GB2312"); string url = string.Format(";AgentID={0}&Pa ssWord={1}&phone={2}&msg={3}&sendtime={4}", GetSettings("AgentID"), GetSettings("PassWord"), phone,System.Web.HttpUtility.UrlEncode( message,encoder), sendtime); System.Net.WebClient wClient = new System.Net.WebClient(); string msg = System.Text.Encoding.Default.GetString(wClient.DownloadData(url)); wClient.Dispose(); //删除已经发送成功的,并保存发送记录 if (msg == "发送成功") { DateTime dtsend = sendtime == "0" ? DateTime.Now : DateTime.ParseExact(sendtime, "yyyyMMddHHmmss", null); string sql = string.Format("delete from [tbl_note_outbox] where [sysid]={0} INSERT INTO [tbl_note_log] ([admin_inner_code],[user_inner_code],[status],[phone],[message],[sen dtime]) VALUES('{1}','{2}','{3}','{4}','{5}','{6}')", rdr["sysid"], rdr["admin_inner_code"], rdr["user_inner_code"], msg, phone, message, dtsend); SqlConnection conn = new SqlConnection(GetSettings("ConnString")); SqlCommand delete = new SqlCommand(sql, conn); conn.Open(); delete.ExecuteNonQuery(); conn.Close(); delete.Dispose(); } } rdr.Close(); con.Close(); cmd.Dispose(); } } catch (Exception ex) { string errorPath = CurrentPath + "Log\\error.log"; if (!File.Exists(errorPath)) { FileStream create = File.Create(errorPath); create.Close(); } FileStream fs = new FileStream(errorPath, FileMode.Append, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine("Exception: " +ex.Message+" --"+ DateTime.Now.ToString()); sw.Flush(); sw.Close(); fs.Close(); } } 上面我们使用try、catch访问数据库,并记录错误异常信息. 发送短信是使用发送一个Web请求发送出去的,要注意请求url字符串的编码类型,要与请求页面编码一致,不然会出现乱码.上面我们请求的是智网通集团短信(网址:)的Web接口,通过访问他的网站来实现发短信,当然还要传递一些用户名、密码、手机号码和要发送的短信息等参数.他的收费平均大概为7分/条的样子,其实我原本不想用发送Web请求的这样方式来发送短信的,它本身提供了调用它发送短信的DLL,而且还有vc、delphi调用的Demo,但是没有用C#调用的例子,我刚开始试着用非托管动态链接库他提供的DLL,不知方法调用那里出错了一直都没能成功发送出短信,所以后来就用了他的Web方式接口了.他页面直接返回发送短信的状态信息.返回发送成功则短信发送成功,成功后 我再将此条信息从要发送短信表里删除并保存在发送记录表里面,以备日后方便 查询.其实登陆他的官网进入后台也能方便的查询,如下图
/
本文档为【C# Windows服务 定时执行访问数据库循环发送手机短信】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索