服务器端操作,我们建立WebService,使用默认的Service.cs,然后再添加两个类,一个做数据库操作的DataControl类,另一个做日志操作及公用法的Common类。
在Service.cs中添加两个WebService方法
// 接收数据方法
[WebMethod]
public bool inceptData(string[] item)
{
dataList.Add(item);
return true;
}
// 接收客户端消息数据传递完毕
[WebMethod]
public bool finishTrans()
{
DataControl dc = new DataControl();
dc.doInsertDate(dataList);
return true;
}
在DataControl类中加入启动线程的方法,数据库操作的方法
private static Thread thread = null;
// 调用线程做操作
public bool doInsertDate(List<string[]> _list)
{
try
{
list = _list;
thread = new Thread(new ThreadStart(work));
thread.Start();
}
catch(Exception ex)
{
Common.ThreadeLog("start", "启动异常 : " + ex.Message);
}
return true;
}
// 线程启动的方法,做数据库操作
private void work()
{
try
{
//将所有数据保存到XML文件做备份,再做操作
Common.saveToXML("文件名", list);
//调用其它方法
//.......
Common.saveLog(Common.getDate() + " 操作完成");
}
catch (ThreadAbortException ex)
{
Common.ThreadeLog("exception", "存入数据异常" + ex.Message);
if (thread.IsAlive == true)
thread.Abort();
}
finally
{
if (thread.IsAlive == true)
thread.Abort();
Common.ThreadeLog("stop", "线程中止");
}
}
在Common中加入相关写日志的方法
// 线程操作日志,start,exception,stop,启动,异常,停止
public static void ThreadeLog(string flag,string annotate)
{
//创建文件与目录
if (!Directory.Exists(directoryName))
Directory.CreateDirectory(directoryName);
if (!File.Exists(threadLogFile))
File.Create(threadLogFile);
try
{
FileStream fileStream = null;
StreamWriter sw = null;
fileStream = new FileStream(threadLogFile, FileMode.Open, FileAccess.Write);
sw = new StreamWriter(fileStream);
sw.BaseStream.Seek(0, SeekOrigin.End);
switch (flag)
{
case "start":
{
sw.WriteLine(getDate() + " " + "thread start " + annotate );
break;
}
case "exception":
{
sw.WriteLine(getDate() + " " + "thread Exception " + annotate);
break;
}
case "stop":
{
sw.WriteLine(getDate() + " " + "thread stop " + annotate);
break;
}
}
sw.Flush();
sw.Close();
fileStream.Close();
}
catch(Exception ex)
{
//保存出错,写入日志
saveLog(ex.Message);
}
}
// 保存文件出错日志
public static void saveLog(string message)
{
if (!Directory.Exists(directoryName))
Directory.CreateDirectory(directoryName);
if (!File.Exists(saveLogFile))
File.Create(saveLogFile);
try
{
FileStream fileStream = null;
StreamWriter sw = null;
fileStream = new FileStream(saveLogFile, FileMode.Open, FileAccess.Write);
sw = new StreamWriter(fileStream);
sw.BaseStream.Seek(0, SeekOrigin.End);
sw.WriteLine(getDate() + " " + message);
sw.Flush();
sw.Close();
fileStream.Close();
}
catch
{ }
}
// 将所有数据保存到XML文件备查
public static void saveToXML(string fileName,List<string[]> list )
{
if (!File.Exists(fileName))
{
try
{
XmlTextWriter xmlText = new XmlTextWriter(fileName, Encoding.UTF8);
xmlText.WriteStartDocument();
xmlText.WriteStartElement("Context");
for (int i = 0; i < list.Count; i++)
{
xmlText.WriteStartElement("Row");
xmlText.WriteAttributeString("OrderNO", list[i][0].ToString());
xmlText.WriteAttributeString("OrderPerson", list[i][1].ToString());
xmlText.WriteAttributeString("ManufactureNO", list[i][2].ToString());
xmlText.WriteAttributeString("TagNO", list[i][3].ToString());
xmlText.WriteAttributeString("transTime", list[i][4].ToString());
xmlText.WriteEndElement();
}
xmlText.WriteEndElement();
xmlText.WriteEndDocument();
xmlText.Flush();
xmlText.Close();
}
catch (Exception ex)
{
saveLog("文件创建失败 : " + ex.Message);
}
}
else
{
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fileName);
XmlNode root = xmlDoc.SelectSingleNode("Context");
for (int i = 0; i < list.Count; i++)
{
XmlElement xe = xmlDoc.CreateElement("ROW");
xe.SetAttribute("OrderNO", list[i][0].ToString());
xe.SetAttribute("OrderPerson", list[i][1].ToString());
xe.SetAttribute("ManufactureNO", list[i][2].ToString());
xe.SetAttribute("TagNO", list[i][3].ToString());
xe.SetAttribute("transTime", list[i][4].ToString());
root.AppendChild(xe);
}
xmlDoc.Save(fileName);
}
catch (Exception ex)
{
Common.saveLog("写入文件失败" + ex.Message);
}
}
}
做完这些所有操作后,我们发布网站,在打开本机IIS,在默认网站下增加虚拟目录,路径指向我们发布的WebService目录
然后在客户端调用的时候,我们首先添加Web引用,例如http://localhost/Usethread/Service.asmx,在频繁调用的地方使用
request = (HttpWebRequest)WebRequest.Create(service.Url);
request.KeepAlive = true;
来请求http资源,并且建立持久性连接,然后就可以进行其它业务逻辑的处理。
具体实现可以下载资源(http://dl2.csdn.net/down4/20071226/26222659995.rar)查看完整的实现。