最近做一个系统,需要用到windows服务,感慨良多。这里讲开发过程中遇到的问题在此分享。
1服务程序的编写
开始觉得和普通控制台程序没啥区别,后来发现区别挺大的
2.服务安装和调试
主要的问题都出在这,当然也和自己编码关系挺大。
开始服务安装没啥问题,但是就是无法启动。弹出错误1053,服务无法启动。经过总结,弹出这个问题必定是初始化代码或OnStart()里出了问题。
第一个问题是自己代码走查发现的,vs2010坑爹的工具箱里默认的Timer是不能在非winform中使用的,详情可见http://www.cnblogs.com/shang20017/archive/2009/03/16/1413798.html
改了这个还是无法启动,把代码全屏蔽一句一句往里面加反复安装尝试,发现问题在于我之前用了一个Messagebox来报异常,在Debug那里是没问题的,但是过来就有问题了。
这下服务可以安装启动了,但我发现服务还是未能才上数据。
按照网上附加到进程的方法感觉挺不好用的,最后用的日志调试的。
调试建议用日志,如
1 //日志记录器 2 log4net.ILog Logger = log4net.LogManager.GetLogger("MyLogger"); 3 4 Logger.Info("====================数据采集程序尝试启动===================="); 5 Logger.Info("程序版本:" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); 6 InitializeComponent();
需引用log4net.dll。引后还需在app.config中添加
<log4net> <root> <level value="ALL" /> <appender-ref ref="LogFileAppender" /> </root> <appender name="LogFileAppender" type="log4net.Appender.FileAppender" > <param name="File" value="ServiceLog-file.log" /> <param name="AppendToFile" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] <%X{auth}>%n - %m%n" /> </layout> </appender> </log4net>
assembly中添加以下信息
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", Watch = true)]
用日志调试发现问题在于读取xml无法读上,但是在debug读取没问题。用绝对路径尝试了下发现是坑爹的路径问题,用下面的方法解决了。
参考链接http://www.cppblog.com/skybook/archive/2008/10/07/63383.html?opt=admin
在Windows服务里面,如果访问文件,采用绝对路径可以.如果采用相对路径,和生成的服务文件在同一目录下面.
using System.Reflection; using System.IO; static string assemblyFilePath = System.Reflection.Assembly.GetExecutingAssembly().Location; static string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath); readonly static string TimeInterval = XmlHelper.Read(assemblyDirPath + "\\Settings.xml", "Set/DataMode", "TimeInterval");
完成了之后就觉得开始还是走了不少弯路,这里把问题发出来和大家共勉,希望能帮助到大家。