很怀念以前做机票的日子,,,,可惜回不去
以前的项目中的,拿来贴贴
场景:同步第三方数据,监听指定地址(指定时间间隔,否则不满足,因为需要处理粘包问题,改篇未实现)
主要内容四个文件;下面分别说下每个文件的功能。
1.HttpRequestManager.cs顾名思义,HttpRequest
public class HttpRequestManager{int _sDefaultLen = 102400;public virtual void OnHttpRequest(object context){HttpListenerContext hltc = context as HttpListenerContext;if (hltc.Request.QueryString["cmd"] == null){try{//反馈给第三方平台 无CMD关键字ReSendMsgService.SendResponse(hltc, "无CMD关键字");}catch (Exception ex){MyLog.WriteLog("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "返回给第三方无CMD关键字失败" + ex.Message);}//记录本地日志MyLog.WriteLog("对象:OnHttpRequest:无CMD关键字,请联系第三方平台");return;}string sCmd = hltc.Request.QueryString["cmd"].ToUpper();switch (sCmd){case "SUBMITPOLICY"://指定接收方法MyLog.WriteLog("对象:指令通过,当前指令为SUBMITPOLICY");OnReceivPolisy(hltc);break;default://反馈第三方平台,并记录本地日志 ,cmd指令错误 您的请求不被识别try{ReSendMsgService.SendResponse(hltc, "PifRecvAgent 您的请求不被识别," + sCmd);}catch (Exception ex){MyLog.WriteLog("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "返回给第三方PifRecvAgent 您的请求不被识别失败" + ex.Message);}MyLog.WriteLog("对象:OnHttpRequest: 第三方平台的请求不被识别");break;}}//接收,解析方法void OnReceivPolisy(HttpListenerContext hltc){byte[] buffer = new byte[_sDefaultLen];Stream stream = hltc.Request.InputStream;int sLen = 0;int sIndex = 0;while ((sIndex = stream.Read(buffer, sLen, 512)) != 0)sLen += sIndex;if (sLen < 1){//反馈给第三方,并记录本地日志try{ReSendMsgService.SendResponse(hltc, "Post的数据为空.");}catch (Exception ex){GLOBAL.MyLog.WriteLog("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "返回给第三方Post的数据为空失败" + ex.Message);}MyLog.WriteLog("对象:OnReceivPolisy: Post的数据为空.");}//解析、入库bool jxbl = RelePolicyBuffer(buffer, buffer.Length);if (!jxbl)//XML解析失败 {try{//发送指令给第三方ReSendMsgService.SendResponse(hltc, "XML结构解析失败");}catch (Exception ex){MyLog.WriteLog("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "返回给第三方XML结构解析失败失败" + ex.Message);}}//否则发送0给第三方try{ReSendMsgService.SendResponse(hltc, new byte[] { 0x30 });}catch (Exception ex){MyLog.WriteLog("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "返回给第三方 0 失败" + ex.Message);}}int r = 1;//解析入库方法bool RelePolicyBuffer(byte[] buffer, int bLen){//此处为解析xml的脚本,省略,,,,,,,xmltextreader方式解析,单向只读 }} }
2.ReSendMessage.cs实现(接受结果之后给第三方返回接受结果信息)
/// <summary>/// /将响应结果反馈第三方,否则第三方默认失败,如此将延迟发送时间/// </summary>public class ReSendMsgService{#region SendResponse 给请求发发送应答public static bool SendResponse(HttpListenerContext ctx, string sErr){byte[] buf = Encoding.Default.GetBytes(sErr);return SendResponse(ctx, 200, buf);}public static bool SendResponse(HttpListenerContext ctx, byte[] buf){return SendResponse(ctx, 200, buf);}public static bool SendResponse(HttpListenerContext ctx, int nStatusCode, byte[] buf){try{ctx.Response.StatusCode = nStatusCode;ctx.Response.ContentLength64 = buf.Length;ctx.Response.OutputStream.Write(buf, 0, buf.Length);return true;}catch (Exception ex){}return false;}#endregion}
3.ThreadEntrustManager.cs类,用于监听器的初始化,见代码
/// <summary>/// 委托方法类/// </summary>public class ThreadEntrustManager{protected HttpListener _listener;Thread _ListenerThread;bool _bThreadLoop;string url;static string _ListenerUrls = XmlHelp.GetXmlNode("LocalListenUrl").InnerText;string[] _ListenerUrlsArray = _ListenerUrls.Split(';');public void ListenerStart(){if (_ListenerUrlsArray.Length > 0){_listener = new HttpListener();_bThreadLoop = true;foreach (string strUrl in _ListenerUrlsArray){url = strUrl;_listener.Prefixes.Add(url);//添加监听前缀对象 }_listener.Start();MyLog.WriteLog("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " start listening...");_ListenerThread = new Thread(new ThreadStart(ThreadFunction));_ListenerThread.Start();}else{_bThreadLoop = false;//日志}}void ThreadFunction(){while (_bThreadLoop){try{HttpListenerContext hltc = _listener.GetContext();ThreadPool.QueueUserWorkItem(new HttpRequestManager().OnHttpRequest, hltc); //线程池委托接收对象 }catch (Exception ex){GLOBAL.MyLog.WriteLog(ex);Trace.Fail("对象:ThreadFunction :An error occured in database access, details: " + ex.Message);}}}public void ListenerClose(){_ListenerThread.Abort();_bThreadLoop = false;_listener.Close();}}
4.MainManager.cs主方法,程序启动时初始化调用
/// <summary>/// 主函数方法类/// </summary>public class MainManager{/// <summary>/// 主方法 开始是方法/// </summary>public static void MainStart(){try{_ListenerStart();}catch (Exception ex){//记录异常日志信息}}public static void _ListenerStart(){ThreadEntrustManager manager = new ThreadEntrustManager();manager.ListenerStart();}public static void Close(){new ThreadEntrustManager().ListenerClose();}}