系统里面有个页面需要调用服务执行自动插入日志文件!
第一次启动服务时可以执行插入,但是不能自动调用第二次调用服务,
这是服务代码
-----
using System.Threading;
public partial class SZFSNService : ServiceBase
{
EventLog loger;
Thread t, exeT;
private int times = Convert.ToInt32(ConfigurationSettings.AppSettings["IntervalTime"]);
private string Pageurl = Convert.ToString(ConfigurationSettings.AppSettings["PageUrl"]);
private int _scanNum = 0; // 扫描次数 private int num = 0; public int Num
{
get
{
return ++num;
}
}
public SZFSNService()
{
InitializeComponent();
if (!EventLog.Exists("TLW-YDYSSN"))
{
//TODO: 创建日志
EventLog.CreateEventSource("TLW-YDYSSN", "TLW-YDYSSN");
}
loger = new EventLog();
loger.Log = "TLW-YDYSSN";
loger.Source = "TLW-YDYSSN";
} protected override void OnStart(string[] args)
{
t = new Thread(new ThreadStart(OperateStart));
t.Start();
} protected override void OnStop()
{
while (t != null)
{
if (exeT.ThreadState != ThreadState.Running)
{
if (exeT.ThreadState != ThreadState.Stopped && exeT.ThreadState != ThreadState.AbortRequested)
{
try
{
loger.WriteEntry(string.Format("正在强制中止执行线程[{0}.{1}]", exeT.ManagedThreadId, exeT.ThreadState.ToString()));
exeT.Abort();
}
catch (ThreadAbortException)
{
Thread.Sleep(times);
}
}
}
if (exeT.ThreadState == ThreadState.Stopped)
{
exeT = null;
try
{
t.Abort();
}
catch { }
finally { t = null; }
GC.Collect();
loger.WriteEntry("获取SN服务已停止");
loger.Close();
loger.Dispose();
return;
}
Thread.Sleep(times);
}
} /// <summary>
/// 操作开始
/// </summary>
private void OperateStart()
{
// 如果上一次的计算尚未停止, 轮循线程, 继续睡觉.
if ((exeT == null || exeT.ThreadState == ThreadState.Stopped))
{
// 在首次启动时, 清除日志, 防止服务意外中止后无法启动.
// 无法启动的根本原因在于服务没有正常停止, 日志数据不符合启动的条件. 陷入死循环.
if (_scanNum++ == 0)
loger.Clear();
if (loger.Entries.Count == 0 || ((loger.Entries[loger.Entries.Count - 1].Message.StartsWith("Finish") && loger.Entries[loger.Entries.Count - 2].Message == "Start") || (loger.Entries[loger.Entries.Count - 1].Message == "Stop" || loger.Entries[loger.Entries.Count - 1].Message == "获取SN服务已停止")))
{
if (loger.Entries.Count > 2000)
loger.Clear();
try
{
exeT = new Thread(new ThreadStart(Dopage));
exeT.Priority = ThreadPriority.AboveNormal;
exeT.Start();
}
catch (Exception ex)
{
loger.WriteEntry("ErrorGetSN:\t" + ex.StackTrace + ex.Message);
}
}
}
if (exeT != null && (exeT.ThreadState == ThreadState.WaitSleepJoin || exeT.ThreadState == ThreadState.Aborted))
exeT = null;
// 守护线程休眠2秒, 等待执行线程运行, 避免出现抢占访问配置文件.
Thread.Sleep(times);
Thread.Sleep(times);
} private void Dopage()
{
try
{
using (WebClient wc = new WebClient())
{
wc.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; )");
byte[] homePageBody = wc.DownloadData(Pageurl);
}
}
catch (ThreadAbortException)
{
GC.Collect();
loger.WriteEntry("回收资源完成, 等待线程结束.");
Thread.CurrentThread.Join(5000);
loger.WriteEntry("清空运行线程完成");
}
catch (Exception ex)
{
loger.WriteEntry("程序异常:" + ex.Message);
Thread.Sleep(100);
loger.WriteEntry("程序异常:" + ex.StackTrace);
}
loger.WriteEntry("获取SN服务完成");
loger.WriteEntry("Stop");
}
}
这是配置文件---
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
</configSections>
<appSettings>
<!--间隔调用服务的时间-->
<add key="IntervalTime" value="1000000" />
<!--调用页面地址-->
<add key="PageUrl" value="http://localhost/fjydys/YDYS/Controls/GetSzfSN.aspx" />
</appSettings>
</configuration>
这个是调用服务的页面protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GetInfo();
}
}
/// <summary>
/// 调用省政府下发审批办件信息的方法
/// </summary>
/// <returns></returns>
public void GetInfo()
{
ZFWebService.DubanhanService szfserive = new ZFWebService.DubanhanService();
string deptcode = ConfigurationSettings.AppSettings["DeptCode"];
string password = ConfigurationSettings.AppSettings["PassWord"];
string result = szfserive.getInfoBase(deptcode, password);
string[] results = result.Split('|');
if (result.StartsWith("RESULT"))
{
if (results[0].Equals("RESULT=成功"))
{
if (!results[1].Equals("MSG=0"))
{
//将文件另存于xml文件中
WriteFile(results[1].Replace("MSG=", ""));
//读取xml文件的值入库
ReadXFSPBJXX(results[1].Replace("MSG=",""));
}
else
{
ApplicationLog.WriteInfo("没有需要处理的报件");
}
}
else
{
ApplicationLog.WriteError("从省级网上审批系统获取厅局需处理的审批件信息失败,失败原因:");
ApplicationLog.WriteError(results[1]);
}
}
}
/// <summary>
/// 将得到的字符串另存为xml文件,文件名称为当时的日期加时间
/// </summary>
/// <param name="xmlContent"></param>
public void WriteFile(string xmlContent)
{
string time = DateTime.Now.ToShortDateString().Replace("-","");
time +=""+DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second;
string filepath = Server.MapPath("./xmltemp/") + "XFSPInfo"+time+".xml";
XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlContent);
xml.Save(filepath);
}
public void ReadXFSPBJXX(string xmlContent)
{
XmlDocument xmld = new XmlDocument();
xmld.LoadXml(xmlContent);
foreach (XmlNode node in xmld.ChildNodes)
{
string InfoType = "";
string sn = "";
string projname = "";
foreach (XmlNode nodechild in node.ChildNodes)
{
string nodename = nodechild.Name.ToLower();
if (nodename.Equals("infotype"))
InfoType = nodechild.InnerText;
if (nodename.Equals("sn"))
sn = nodechild.InnerText;
if (nodename.Equals("projectname"))
projname = nodechild.InnerText;
}
if(sn.Length!=0)
InsertSN(projname, sn);
//判断如果Infotype=1则表明还有报件需要处理,则继续调用服务
if (InfoType.Equals("1"))
GetInfo();
}
}
/// <summary>
/// 将获取到的项目名称和sn保存到数据库中
/// </summary>
/// <param name="ProjName">项目名称</param>
/// <param name="SN">网上申报系统申报号</param>
/// <returns>执行结果</returns>
public void InsertSN(string ProjName, string SN)
{
string sql = "insert into BL_PROJ_SN values(?,?)";
OleDbParameter[] param = new OleDbParameter[] {
new OleDbParameter("PROJ_NAME", ProjName),
new OleDbParameter("SN", SN)
};
try
{
DbFactory.Instance.GetDbHelp("Default").ExecuteNonQuery(sql, CommandType.Text, param);
ApplicationLog.WriteTrace("报件名称:" + ProjName + "的SN号:" + SN + "入库成功");
}
catch (Exception e)
{
ApplicationLog.WriteTrace("报件名称:" + ProjName + "的SN号:" + SN + "入库失败,失败原因:" + e.Message);
}
}
/// <summary>
/// 清除BL_PROJ_SN表的数据
/// </summary>
/// <returns></returns>
public void DeleteSN()
{
string sql = "delete BL_PROJ_SN";
try
{
ApplicationLog.WriteTrace("开始清除BL_PROJ_SN的数据");
DbFactory.Instance.GetDbHelp("Default").ExecuteNonQuery(sql);
}
catch (Exception e)
{
ApplicationLog.WriteTrace("BL_PROJ_SN表的数据清除失败,失败原因" + e.Message);
}
}
第一次启动服务时可以执行插入,但是不能自动调用第二次调用服务,
这是服务代码
-----
using System.Threading;
public partial class SZFSNService : ServiceBase
{
EventLog loger;
Thread t, exeT;
private int times = Convert.ToInt32(ConfigurationSettings.AppSettings["IntervalTime"]);
private string Pageurl = Convert.ToString(ConfigurationSettings.AppSettings["PageUrl"]);
private int _scanNum = 0; // 扫描次数 private int num = 0; public int Num
{
get
{
return ++num;
}
}
public SZFSNService()
{
InitializeComponent();
if (!EventLog.Exists("TLW-YDYSSN"))
{
//TODO: 创建日志
EventLog.CreateEventSource("TLW-YDYSSN", "TLW-YDYSSN");
}
loger = new EventLog();
loger.Log = "TLW-YDYSSN";
loger.Source = "TLW-YDYSSN";
} protected override void OnStart(string[] args)
{
t = new Thread(new ThreadStart(OperateStart));
t.Start();
} protected override void OnStop()
{
while (t != null)
{
if (exeT.ThreadState != ThreadState.Running)
{
if (exeT.ThreadState != ThreadState.Stopped && exeT.ThreadState != ThreadState.AbortRequested)
{
try
{
loger.WriteEntry(string.Format("正在强制中止执行线程[{0}.{1}]", exeT.ManagedThreadId, exeT.ThreadState.ToString()));
exeT.Abort();
}
catch (ThreadAbortException)
{
Thread.Sleep(times);
}
}
}
if (exeT.ThreadState == ThreadState.Stopped)
{
exeT = null;
try
{
t.Abort();
}
catch { }
finally { t = null; }
GC.Collect();
loger.WriteEntry("获取SN服务已停止");
loger.Close();
loger.Dispose();
return;
}
Thread.Sleep(times);
}
} /// <summary>
/// 操作开始
/// </summary>
private void OperateStart()
{
// 如果上一次的计算尚未停止, 轮循线程, 继续睡觉.
if ((exeT == null || exeT.ThreadState == ThreadState.Stopped))
{
// 在首次启动时, 清除日志, 防止服务意外中止后无法启动.
// 无法启动的根本原因在于服务没有正常停止, 日志数据不符合启动的条件. 陷入死循环.
if (_scanNum++ == 0)
loger.Clear();
if (loger.Entries.Count == 0 || ((loger.Entries[loger.Entries.Count - 1].Message.StartsWith("Finish") && loger.Entries[loger.Entries.Count - 2].Message == "Start") || (loger.Entries[loger.Entries.Count - 1].Message == "Stop" || loger.Entries[loger.Entries.Count - 1].Message == "获取SN服务已停止")))
{
if (loger.Entries.Count > 2000)
loger.Clear();
try
{
exeT = new Thread(new ThreadStart(Dopage));
exeT.Priority = ThreadPriority.AboveNormal;
exeT.Start();
}
catch (Exception ex)
{
loger.WriteEntry("ErrorGetSN:\t" + ex.StackTrace + ex.Message);
}
}
}
if (exeT != null && (exeT.ThreadState == ThreadState.WaitSleepJoin || exeT.ThreadState == ThreadState.Aborted))
exeT = null;
// 守护线程休眠2秒, 等待执行线程运行, 避免出现抢占访问配置文件.
Thread.Sleep(times);
Thread.Sleep(times);
} private void Dopage()
{
try
{
using (WebClient wc = new WebClient())
{
wc.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; )");
byte[] homePageBody = wc.DownloadData(Pageurl);
}
}
catch (ThreadAbortException)
{
GC.Collect();
loger.WriteEntry("回收资源完成, 等待线程结束.");
Thread.CurrentThread.Join(5000);
loger.WriteEntry("清空运行线程完成");
}
catch (Exception ex)
{
loger.WriteEntry("程序异常:" + ex.Message);
Thread.Sleep(100);
loger.WriteEntry("程序异常:" + ex.StackTrace);
}
loger.WriteEntry("获取SN服务完成");
loger.WriteEntry("Stop");
}
}
这是配置文件---
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
</configSections>
<appSettings>
<!--间隔调用服务的时间-->
<add key="IntervalTime" value="1000000" />
<!--调用页面地址-->
<add key="PageUrl" value="http://localhost/fjydys/YDYS/Controls/GetSzfSN.aspx" />
</appSettings>
</configuration>
这个是调用服务的页面protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GetInfo();
}
}
/// <summary>
/// 调用省政府下发审批办件信息的方法
/// </summary>
/// <returns></returns>
public void GetInfo()
{
ZFWebService.DubanhanService szfserive = new ZFWebService.DubanhanService();
string deptcode = ConfigurationSettings.AppSettings["DeptCode"];
string password = ConfigurationSettings.AppSettings["PassWord"];
string result = szfserive.getInfoBase(deptcode, password);
string[] results = result.Split('|');
if (result.StartsWith("RESULT"))
{
if (results[0].Equals("RESULT=成功"))
{
if (!results[1].Equals("MSG=0"))
{
//将文件另存于xml文件中
WriteFile(results[1].Replace("MSG=", ""));
//读取xml文件的值入库
ReadXFSPBJXX(results[1].Replace("MSG=",""));
}
else
{
ApplicationLog.WriteInfo("没有需要处理的报件");
}
}
else
{
ApplicationLog.WriteError("从省级网上审批系统获取厅局需处理的审批件信息失败,失败原因:");
ApplicationLog.WriteError(results[1]);
}
}
}
/// <summary>
/// 将得到的字符串另存为xml文件,文件名称为当时的日期加时间
/// </summary>
/// <param name="xmlContent"></param>
public void WriteFile(string xmlContent)
{
string time = DateTime.Now.ToShortDateString().Replace("-","");
time +=""+DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second;
string filepath = Server.MapPath("./xmltemp/") + "XFSPInfo"+time+".xml";
XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlContent);
xml.Save(filepath);
}
public void ReadXFSPBJXX(string xmlContent)
{
XmlDocument xmld = new XmlDocument();
xmld.LoadXml(xmlContent);
foreach (XmlNode node in xmld.ChildNodes)
{
string InfoType = "";
string sn = "";
string projname = "";
foreach (XmlNode nodechild in node.ChildNodes)
{
string nodename = nodechild.Name.ToLower();
if (nodename.Equals("infotype"))
InfoType = nodechild.InnerText;
if (nodename.Equals("sn"))
sn = nodechild.InnerText;
if (nodename.Equals("projectname"))
projname = nodechild.InnerText;
}
if(sn.Length!=0)
InsertSN(projname, sn);
//判断如果Infotype=1则表明还有报件需要处理,则继续调用服务
if (InfoType.Equals("1"))
GetInfo();
}
}
/// <summary>
/// 将获取到的项目名称和sn保存到数据库中
/// </summary>
/// <param name="ProjName">项目名称</param>
/// <param name="SN">网上申报系统申报号</param>
/// <returns>执行结果</returns>
public void InsertSN(string ProjName, string SN)
{
string sql = "insert into BL_PROJ_SN values(?,?)";
OleDbParameter[] param = new OleDbParameter[] {
new OleDbParameter("PROJ_NAME", ProjName),
new OleDbParameter("SN", SN)
};
try
{
DbFactory.Instance.GetDbHelp("Default").ExecuteNonQuery(sql, CommandType.Text, param);
ApplicationLog.WriteTrace("报件名称:" + ProjName + "的SN号:" + SN + "入库成功");
}
catch (Exception e)
{
ApplicationLog.WriteTrace("报件名称:" + ProjName + "的SN号:" + SN + "入库失败,失败原因:" + e.Message);
}
}
/// <summary>
/// 清除BL_PROJ_SN表的数据
/// </summary>
/// <returns></returns>
public void DeleteSN()
{
string sql = "delete BL_PROJ_SN";
try
{
ApplicationLog.WriteTrace("开始清除BL_PROJ_SN的数据");
DbFactory.Instance.GetDbHelp("Default").ExecuteNonQuery(sql);
}
catch (Exception e)
{
ApplicationLog.WriteTrace("BL_PROJ_SN表的数据清除失败,失败原因" + e.Message);
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货