windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志。计算机启动时,服务会自动开始运行,他们不要用户一定登陆才运行。
可以通过选择菜单“开始”-〉“控制面板”-〉“管理工具”-〉“服务”来查看现有系统中的服务,如下图:

创建window 服务
新建一个window 服务项目MyService,如下图

从工具箱的组件表中拖动一个Timer对象到这个视图设计器上面。
设置Timer属性,Enable为true,Interval属性为3000毫秒

双击Timer事件,添加事件
后台代码
1 public partial class Service1 : ServiceBase 2 { 3 public Service1() 4 { 5 InitializeComponent(); 6 } 7 protected override void OnStart(string[] args) 8 { 9 // TODO: 在此处添加代码以启动服务。 10 string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "启动"; 11 WriteLog(state); 12 } 13 protected override void OnStop() 14 { 15 // TODO: 在此处添加代码以执行停止服务所需的关闭操作。 16 string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止"; 17 WriteLog(state); 18 } 19 private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 20 { 21 WriteLog(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); 22 } 23 public void WriteLog(string str) 24 { 25 using (StreamWriter sw = File.AppendText(@"c:\service.txt")) 26 { 27 sw.WriteLine(str); 28 sw.Flush(); 29 } 30 } 31 }
其中OnStart和OnStop分别是服务器启动和停止后,所发生的事件操作方法,WriteLog是操作方法;
将服务程序service1.cs 切换到视图模式,用鼠标右键单击设计视图选择“添加安装程序”选项,此后在项目中自动增加了一个ProjectInstaller.cs,如下图

设置serviceInstaller1组件属性,
ServiceName=MyServiceLog安装服务器名字;
StartType=Automatic 开机自动启动
设计serviceProcessInstaller1的属性Account=LocalSystem;
运行编译,一个简单的windows服务已经开发完成
注:如果在代码中的文件路径写成如下“service.txt”,那么此时文件保存在C:\WINDOWS\system32文件夹中。
安装window服务
安装命令:InstallUtil.exe MyServiceLog.exe
InstallUtil存在路径为:C:\WINDOWS\Microsoft.NET\Framework\.NET版本号
复制C:\WINDOWS\Microsoft.NET\Framework\版本号 路径中的InstallUtil.exe 到bin/debug或bin/release文件夹中,在命令行窗口中直接运行命令
InstallUtil.exe MyServiceLog.exe,在系统中注册这个服务,使它建立一个合适的注册项,如下图:

然后再window服务列表中,启动MyServiceLog服务
卸载window 服务
命令:InstallUtil.exe MyServiceLog.exe /u
如果修改这个服务,但是路径没有变化的话是不需要重新注册服务的,直接停止服务,然后用新的文件覆盖原来的文件即可,如果路径发生变化,应该先卸载这个服务,然后重新安装这个服务。
Window服务应用程序体系结构
.net framework对windows服务提供了更多的支持,在命名空间System.ServiceProcess下.
包括类如下:
ServiceBase 所有Window服务的基类
ServiceController 该类的一个实例代表一个具体的windows服务
ServiceControllerPermission 用于控制ServiceController的使用权限
ServiceInstaller 用于执行对windows服务的安装
ServiceProcessInstaller 用于执行对windows服务的安装,与上类的不同的是,该类可以代表一个可以执行的windows服务的进程.
ServiceBase类
ServiceBase方法:
| 方法 | 描述 |
| Run() | 运行一个windows服务 |
| OnContinue() | 继续执行服务 |
| OnCustomCommand() | 向windows服务发出自定指令 |
| OnPause() | 暂停正在运行的windows服务 |
| OnPowerEvent() | 当计算机的电源状态改变是调用 |
| OnShutDown() | 当系统关闭条用OnStart()开始一个windows服务 |
| OnStop() | 结束一个windows服务 |
ServiceBase属性:
| 属性 | 描述 |
| AutoLog | 表示是否将开始,结束,暂停,继续等指令写入事件日志 |
| CanHandlePowerEvent | 表示该服务是否支持电源事件 |
| CanPauseAndContinue | 表示该服务是否支持暂停和继续功能 |
| CanShutDown | 表示该服务是否支持关闭功能 |
| CanStop | 表示该服务是否支持结构功能 |
| EventLog | 应用程序的时间日志 |
| ServiceName | 该服务名称 |
ServiceController类
服务控制类,用于控制windows服务的各种具体行为,它既可以控制本地的windows服务,有可以控制远程的windows服务。
ServiceControler的方法:
| 方法 | 描述 |
| GetDivices() | 得到一台计算机上设备驱动器服务 |
| GetServices() | 得到一台计算上的非设备驱动器服务 |
| Close() | 用于断开服务连接,并且释放服务控制器所占用的资源 |
| Continue() | 继续被暂停的服务 |
| ExcuteCommand() | 对服务执行一条自定义命令 |
| Pause() | 暂停服务 |
| Refresh() | 对所有属性更新 |
| Start() | 启动服务 |
| Stop() | 停止服务 |
| WaitForStatus() | 等待服务到达指定的状态 |
接Window服务(一)
1 public partial class Service1 : ServiceBase 2 { 3 public Service1() 4 { 5 InitializeComponent(); 6 this.AutoLog = true; 7 } 8 protected override void OnStart(string[] args) 9 { 10 // TODO: 在此处添加代码以启动服务。 11 string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "启动"; 12 WriteLog(state); 13 ServiceController[] sc = ServiceController.GetDevices(); 14 string str = ""; 15 for (int i = 0; i < sc.Length; i++) 16 { 17 WriteLog(sc[i].ServiceName + @"\t" + sc[i].DisplayName + @"\t" + sc[i].Status); 18 } 19 WriteLog(" "); 20 ServiceController[] scArr = ServiceController.GetServices(); 21 for (int i = 0; i < scArr.Length; i++) 22 { 23 WriteLog(scArr[i].ServiceName + "\t" + scArr[i].DisplayName + "\t" + scArr[i].Status); 24 } 25 ServiceController s = new ServiceController(); 26 s.ServiceName = "Sina"; 27 s.Stop(); 28 } 29 protected override void OnStop() 30 { 31 // TODO: 在此处添加代码以执行停止服务所需的关闭操作。 32 string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止"; 33 WriteLog(state); 34 } 35 private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 36 { 37 WriteLog(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); 38 } 39 public void WriteLog(string str) 40 { 41 using (StreamWriter sw = File.AppendText(@"c:\service.txt")) 42 { 43 sw.WriteLine(str); 44 sw.Flush(); 45 } 46 } 47 }
ServiceController属性
| 属性 | 描述 |
| CanPauseAndContinue | 表示服务是否可以停止 |
| CanShutDown | 表示服务在系统关闭时是否可以得到通知,CanStop表示服务器是否可以被停止 |
| DependentServices | 表示与服务相关联的设备 |
| DisplayName | 表示服务控制器所绑定的名称 |
| MachineName | 表示服务所在的计算机名称 |
| ServiceName | 表示绑定的服务名称 |
| ServiceType | 表示控制器所引用的服务类型 |
| ServicesDependedOn | 表示服务所依赖ude服务集合Status表示控制器所引用的服务状态 |
ServiceInstaller类
ServiceInstaller的属性
| 属性 | 描述 |
| DisplayName | 显示名称 |
| ServiceName | 表示服务名称,这个名称必须与Installer将要安装的windows服务名称相同 |
| ServiceDependOn | 服务所要用到的其服务名称的一个数组 |
| StartType | 表示所安装服务的启动特性,可以为Automatic,Manual或Disable,默认为Manual |
ServiceInstaller事件
| 方法 | 事件 |
| AfterInstaller() | 调用Install方法后发生 |
| AfterRollback() | 调用Rollback后发生 |
| AfterUninstall() | 调用Uninstall方法后发生 |
| BeforeInstall() | 调用Install方法前发生 |
| BeforeRollback() | 调用Rollback方法前发生 |
| BeforeUninstall() | 调用Uninstall方法前发生 |
| Committed() | 调用Commit方法后发生 |
| Committing() | 调用Commit方法前发生 |
ServiceProcessInstaller类
用于安装ServiceBase继承的windows服务,它与一个可执行程序中的所有服务所做基本工作相同
属性
| 属性 | 描述 |
| Account | 运行服务的当前用户账号 |
| HelpText | 在服务安装选项中给出的帮助信息 |
| Password | 运行服务的当前账号密码 |
| UserName | 运行服务的当前账号用户名 |
吊死windows服务
1,日志调试法
2,附加进程断电调试法
步骤:
vs打开MySerivceLog项目
在管理工具-〉服务里面启动MyServiceLog服务
单击vs的调试 -〉附加到进程,如下图

在"可用进程“列表中,选中你要调式的服务的可执行文件名
单击 ”附加“按钮,即可进入调试状态
在timer1_Elapsed方法里设置一个断点,然后等它执行,服务执行到该处时候会自动启动断点。

另外,定时服务可能会定时的访问本域或者非本域的页面,
解决办法用WebClient
1 WebClient client = new WebClient(); 2 string uri = "http://127.0.0.1/rss/sina.aspx"; 3 byte[] by = client.DownloadData(uri);


1586

被折叠的 条评论
为什么被折叠?



