windows服务在windows server 2008上运行的问题
开发了一个windows服务,在本地环境(win7)运行测试可以用,但是在目标机上(windows server 2008)上就无法运行,服务的OnStart()方法执行结束后,不执行Timer组件的Elapsed事件处理程序。我做了自定义事件日志输出,明明本地运行的时候可以输出更多的日志,而服务器环境上就只输出到OnStart()方法里的日志,往后都不运行了。第一次写windows服务,测试什么的太捉鸡了,尤其在目标机器上,根本没法测呀。求大神解决。
代码如下:
public partial class XmlToSqlService : ServiceBase
{
private ImportTimer m_timer;
private EventLog m_logger = new EventLog();
//private EventLogger m_logger;
public XmlToSqlService()
{
InitializeComponent();
this.AutoLog = false;
// create an event source, specifying the name of a log that
// does not currently exist to create a new, custom log
if (!EventLog.SourceExists("MySource"))
{
EventLog.CreateEventSource("MySource", "MyXmlLog");
}
// configure the event log instance to use this source name
m_logger.Source = "MySource";
m_logger.WriteEntry("XmlToSqlService is initializing...");
m_timer = new ImportTimer(m_logger);
m_logger.WriteEntry("XmlToSqlService finished initializing");
}
protected override void OnStart(string[] args)
{
m_timer.CreateTimer();
m_logger.WriteEntry("XmlToSqlService Started");
}
protected override void OnStop()
{
m_timer.Stop();
m_logger.WriteEntry("XmlToSqlService Stoped!");
}
protected override void OnPause()
{
m_timer.Stop();
m_logger.WriteEntry("XmlToSqlService Paused!");
}
protected override void OnContinue()
{
m_timer.CreateTimer();
m_logger.WriteEntry("XmlToSqlService Continued!");
}
}
public class ImportTimer
{
private const string DIRECTORY = @"D:\thyb"; //存放xml文件的路径 F:\thyb
private const string DIRECTORY_FASLE = @"D:\thyb_error"; //存放数据有错误的xml文件
private const string EXTEND = ".xml"; //后缀名为xml
private const int MINT1 = 10; //第一次导入的分钟
private const int MINT2 = 37; //第二次导入的分钟
private const int MINT3 = 23; //计算小时API写入文件的操作
private Timer m_timer;
public EventLog m_logger;
public ImportTimer(EventLog logger)
{
m_logger = logger;
CreateDirectory();
m_logger.WriteEntry("ImportTimer Contructed!");
}
public void Stop()
{
m_timer.Dispose();
}
public void Dispose()
{
m_timer.Dispose();
}
private void CreateDirectory()
{
//若不存在存放错误信息的xml文件,则创建
if (!Directory.Exists(DIRECTORY_FASLE))
{
Directory.CreateDirectory(DIRECTORY_FASLE);
}
}
public void CreateTimer()
{
m_timer = new Timer(timer_Elapsed, this, 0, 60 * 1000);
}
private void timer_Elapsed(object sender)
{
m_logger.WriteEntry("Timer Begin One Elapsed");
import();
}
private void import() //执行将所有xml文件导入数据库
{
m_logger.WriteEntry("step into import()");
var files = GetFileList(DIRECTORY);
m_logger.WriteEntry("step import(),file count=" + files.Count());
foreach (var file in files)
{
try
{
else
{
var import = new ImportToSql();
var success = import.xmltodb(file);
if (success == 1)
{
File.Delete(file); //导入成功后删掉xml文件
m_logger.WriteEntry(file + " xml import successfully");
}
if (success == 0)
{
int index = file.LastIndexOf(@"\");
if (!File.Exists(DIRECTORY_FASLE + file.Substring(index)))
File.Move(file, DIRECTORY_FASLE + file.Substring(index));
m_logger.WriteEntry(file + " xml move to error directory");
}
}
}
catch (Exception ee)
{
m_logger.WriteEntry("Exception:" + file.Substring(index) + ":" + ee.Message;)
}
}
}
//获得dir文件夹下所有文件名
private IEnumerable<string> GetFileList(string dir)
{
var directoryPath = dir;
var files = Directory.GetFiles(directoryPath);//获取目录下的所有文件
var xmlFiles = new List<string>();
foreach (var file in files)
{
//过滤为空的xml文件
using (var fs = new FileStream(file, FileMode.Open))
{
using (var sr = new StreamReader(fs))
{
if (sr.ReadToEnd() == string.Empty && file.EndsWith(EXTEND))
{
sr.Close();
File.Delete(file);
continue;
}
}
}
//过滤后缀名为xml的文件
if (file.EndsWith(EXTEND))
{
xmlFiles.Add(file);
}
}
string[] directories = Directory.GetDirectories(directoryPath);
if (directories.Count() != 0)
{
foreach (var directy in directories)
{
var xmlDirecFiles = GetFileList(directy);
xmlFiles.AddRange(xmlDirecFiles);
}
}
return xmlFiles;
}
}
windows 服务 本地环境测试正常 目标机服务异常 windows服务编程 --------------------编程问答-------------------- 首先修改你的程序,让它可以以console方式执行。
然后在win2008上首先这样执行。运行个把小时,没有问题了,再以service方式执行。 --------------------编程问答--------------------
这个服务就是从一个WPF改过来的,WPF程序确定是没问题的,只是觉得WPF程序有界面,会被别的管理员误关,所以才想到改成windows服务。 --------------------编程问答-------------------- 建议异常处理的范围大一些,以便捕捉错误来源,可能是权限问题。 --------------------编程问答--------------------
如果是权限问题的话,windows服务如何获得管理员权限? --------------------编程问答--------------------
做了更大范围的异常处理了,但是仍然没有错误日志输出。很奇怪,timer的 timer_Elapsed函数好像根本就没有执行……如果将import()函数放在服务的OnStart()函数里,会导致服务无法启动…… --------------------编程问答-------------------- 你把timer_Elapsed函数体整个用try/catch检查一下有没有异常,别的代码看不出不正常,涉及文件操作我也没法测试。我觉得问题最大的就是在文件操作这块,可以尝试先把所有涉及文件的代码先注释掉看是否正常,然后逐步恢复,已确定错误位置。 --------------------编程问答--------------------
我做服务的时候也遇到差不多的问题,应该是权限问题,不知道楼主最后怎么解决的?
补充:.NET技术 , C#