很怀念以前做机票的日子,,,,可惜回不去 以前的项目中的,拿来贴贴 场景:同步第三方数据,监听指定地址(指定时间间隔,否则不满足,因为需要处理粘包问题,改篇未实现) 主要内容四个文件;下面分别说下每个文件的功能。 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(); } } |
|