前言:
前段时间因为项目上需要用到实现一个简答的卫星云图播放功能, 因此需要将卫星云图实时下载到本地目录. 当时也没多想, 直接就用控制台程序开发了一个卫星云图自动下载工具. 最近项目不是很忙了, 静下心重新看了一下项目代码, 对部分代码进行了重构......
同时也发现了卫星云图下载工具的问题, 总不能每次客户使用的时候都让客户去跑一遍控制台程序或者一直运行这个控制台程序吧. 于是打算把卫星云图下载工具写成服务的形式, 这样就不用担心卫星云图的实时性了.
说干就干!
开发环境:
操作系统: Windows 10 X64
开发环境: VS2017
编程语言: C#
.NET 版本:.NET Framework 4.5
目标平台: X86
Windows Service 简介:
一个 Windows 服务程序是在 Windows 操作系统下能完成特定功能的可执行的应用程序. Windows 服务程序虽然是可执行的, 但是它不像一般的可执行文件通过双击就能开始运行了, 它必须有特定的启动方式. 这些启动方式包括了自动启动和手动启动两种. 对于自动启动的 Windows 服务程序, 它们在 Windows 启动或是重启之后用户登录之前就开始执行了. 只要你将相应的 Windows 服务程序注册到服务控制管理器 (Service Control Manager) 中, 并将其启动类别设为自动启动就行了. 而对于手动启动的 Windows 服务程序, 你可以通过命令行工具的 NET START 命令来启动它, 或是通过控制面板中管理工具下的服务一项来启动相应的 Windows 服务程序.
同样, 一个 Windows 服务程序也不能像一般的应用程序那样被终止. 因为 Windows 服务程序一般是没有用户界面的, 所以你也要通过命令行工具或是下面图中的工具来停止它, 或是在系统关闭时使得 Windows 服务程序自动停止. 因为 Windows 服务程序没有用户界面, 所以基于用户界面的 API 函数对其是没有多大的意义. 为了能使一个 Windows 服务程序能够正常并有效的在系统环境下工作, 程序员必须实现一系列的方法来完成其服务功能. Windows 服务程序的应用范围很广, 典型的 Windows 服务程序包含了硬件控制, 应用程序监视, 系统级应用, 诊断, 报告, web 和文件系统服务等功能.
使用 C# 开发 Windows 服务的步骤:
1. 创建 Windows Service 项目
从 Visual Studio 2017 工程中选取 Windows 服务 (Windows Service) 选项, 给工程一个新文件名, 然后点击 确定
创建后的项目如下图所示:
2. 找到目录结构中的 OnStart 函数和 OnStop 函数, OnStart 函数在启动服务时执行, OnStop 函数在停止服务时执行
- protected override void OnStart(string[] args)
- {
- StartLoad();
- }
- protected override void OnStop()
- {
- _Timer.Stop();
- }
StartLoad 核心代码如下:
- CreateFilePath();// 判断文件夹是否存在, 不存在则创建
- // 获取前一天日期
- string lastYear = DateTime.Now.AddDays(-1).Year.ToString();
- string lastMonth = DateTime.Now.AddDays(-1).Month.ToString();
- if (lastMonth.Length <2) lastMonth = "0" + lastMonth;
- string lastDay = DateTime.Now.AddDays(-1).Day.ToString();
- if (lastDay.Length < 2) lastDay = "0" + lastDay;
- // 获取当天日期
- string year = DateTime.Now.Year.ToString();
- string month = DateTime.Now.Month.ToString();
- if (month.Length < 2) month = "0" + month;
- string day = DateTime.Now.Day.ToString();
- if (day.Length < 2) day = "0" + day;
- // 设置所有文件名
- string[] dates0 = { lastYear + "/" + lastMonth + "/" + lastDay, year + "/" + month + "/" + day };
- string[] dates = { lastYear + lastMonth + lastDay, year + month + day };
- string[] hours = { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" };
- string[] minutes = { "15", "45" };
- int hLength = hours.Count();
- // 遍历下载当天所有在线云图
- for (int i = 0; i < 2; i++)
- {
- string date = dates[i];
- string date0 = dates0[i];
- for (int j = 0; j < hLength; j++)
- {
- string hour = hours[j];
- for (int k = 0; k < 2; k++)
- {
- string minute = minutes[k];
- string imageUrl = @"http://image.nmc.cn/product/" + date0 + @"/WXCL/SEVP_NSMC_WXCL_ASC_E99_ACHN_LNO_PY_" + date + hour + minute + "00000.JPG";
- string[] s = imageUrl.Split('/');
- string imageName = s[s.Count() - 1];
- HttpWebRequest request = HttpWebRequest.Create(imageUrl) as HttpWebRequest;
- HttpWebResponse response = null;
- try
- {
- response = request.GetResponse() as HttpWebResponse;
- }
- catch (Exception)
- {
- continue;
- }
- if (response.StatusCode != HttpStatusCode.OK) continue;
- Stream reader = response.GetResponseStream();
- FileStream writer = new FileStream(_ImagePath + imageName, FileMode.OpenOrCreate, FileAccess.Write);
- byte[] buff = new byte[512];
- int c = 0; // 实际读取的字节数
- while ((c = reader.Read(buff, 0, buff.Length))> 0)
- {
- writer.Write(buff, 0, c);
- }
- writer.Close();
- writer.Dispose();
- reader.Close();
- reader.Dispose();
- response.Close();
- }
- }
- }
因为要实现卫星云图的实时性, 所以我用了 Timer 计时器来设定每隔 30 分钟下载一次, 代码很简单, 相信大神们都会, 这里就不写了!
安装服务步骤:
1. 打开设计界面, 右键选择 "添加安装程序", 如图所示:
界面上会出现 serviceInstaller1 和 serviceProcessInstaller1
修改 serviceInstaller1 属性, 将 StartType 修改为 Automatic,ServiceName 改为 CloudImageLoad, 同时可以添加 Description 属性, 也就是你的 Windows 服务的描述信息(建议添加)
修改 serviceProcessInstaller1 属性, 将 Account 属性改为 LocalSystem
2. 进行服务的安装
以 "管理员身份" 打开 VS2017 命令提示符工具, 记住一定要以管理员身份运行
随后通过命令 cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319 进入文件目录
通过命令 installutil D:\ 软件开发 \ CloudImageLoad\CloudImageLoad\bin\Debug\CloudImageLoad.exe 完成服务的安装
"D:\ 软件开发 \ CloudImageLoad\CloudImageLoad\bin\Debug\CloudImageLoad.exe" 及为你项目生成的路径
查看服务列表, 此时就可以看到服务已经在服务列表中了
第一次安装的服务应该是没有运行的, 需要手动启动一下!
服务的卸载命令: installutil /u D:\ 软件开发 \ CloudImageLoad\CloudImageLoad\bin\Debug\CloudImageLoad.exe
补充:
1.Service 启动属性:
Manual 服务安装后, 必须手动启动.
Automatic 每次计算机重新启动时, 服务都会自动启动.
Disabled 服务无法启动.
2. 新建的 Service 项目, 其中各属性的含义 (设计视图 -> 右键属性):
Autolog 是否自动写入系统的日志文件
CanHandlePowerEvent 服务时候接受电源事件
CanPauseAndContinue 服务是否接受暂停或继续运行的请求
CanShutdown 服务是否在运行它的计算机关闭时收到通知, 以便能够调用 OnShutDown 过程
CanStop 服务是否接受停止运行的请求
ServiceName 服务名
参考链接:
- https://www.cnblogs.com/bluestorm/p/3510398.html
- https://www.cnblogs.com/cncc/p/7170951.HTML
来源: https://www.cnblogs.com/huangwei1992/p/9693167.html