C#通过HttpListener实现HTTP监听

亦凉 2021-05-03 04:09 1032阅读 1赞
  1. using NLog;
  2. using System;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Net;
  6. using System.ServiceProcess;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Web;
  10. using System.Xml;
  11. namespace MasterCardService
  12. {
  13. public partial class MainService : ServiceBase
  14. {
  15. private static Logger logger = LogManager.GetCurrentClassLogger();
  16. private HttpListener MyListerner;
  17. public MainService()
  18. {
  19. InitializeComponent();
  20. }
  21. public void DebugStart()
  22. {
  23. OnStart(null);
  24. }
  25. protected override void OnStart(string[] args)
  26. {
  27. MyListerner = new HttpListener();
  28. while (true)
  29. {
  30. try
  31. {
  32. MyListerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
  33. MyListerner.Prefixes.Add("http://127.0.0.1:7788/Service/");
  34. MyListerner.Start();
  35. }
  36. catch (Exception ex)
  37. {
  38. logger.Error(ex, "服务器启动失败......");
  39. break;
  40. }
  41. logger.Debug("服务器启动成功......");
  42. //线程池
  43. int minThreadNum;
  44. int portThreadNum;
  45. int maxThreadNum;
  46. ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
  47. ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
  48. logger.Debug("最大线程数:{0}", maxThreadNum);
  49. logger.Debug("最小空闲线程数:{0}", minThreadNum);
  50. //ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);
  51. logger.Debug("\n等待客户连接中......");
  52. while (true)
  53. {
  54. //等待请求连接
  55. //没有请求则GetContext处于阻塞状态
  56. HttpListenerContext ctx = MyListerner.GetContext();
  57. ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc), ctx);
  58. }
  59. }
  60. }
  61. protected override void OnStop()
  62. {
  63. MyListerner?.Stop();
  64. }
  65. void TaskProc(object obj)
  66. {
  67. HttpListenerContext ctx = (HttpListenerContext)obj;
  68. ctx.Response.StatusCode = 200;//设置返回给客服端http状态代码
  69. //接收POST参数
  70. Stream stream = ctx.Request.InputStream;
  71. System.IO.StreamReader reader = new System.IO.StreamReader(stream, Encoding.UTF8);
  72. string body = reader.ReadToEnd();
  73. logger.Debug("收到POST数据:\r\n" + HttpUtility.UrlDecode(body));
  74. var replyMsg = ProcessMessage(body);
  75. //使用Writer输出http响应代码,UTF8格式
  76. using (StreamWriter writer = new StreamWriter(ctx.Response.OutputStream, Encoding.UTF8))
  77. {
  78. writer.Write(replyMsg);
  79. writer.Close();
  80. ctx.Response.Close();
  81. }
  82. }
  83. private string ProcessMessage(string body)
  84. {
  85. XmlDocument recvDoc = new XmlDocument();
  86. recvDoc.LoadXml(body);
  87. XmlNode recvRoot = recvDoc.SelectSingleNode("Msg");
  88. var firstChild = recvRoot.FirstChild;
  89. XmlDocument sendDoc = CreateXmlDocument();
  90. XmlElement sendRoot = CreateRootElement(sendDoc);
  91. sendDoc.AppendChild(sendRoot);
  92. switch (firstChild.Name)
  93. {
  94. case "AgentInfoSet":
  95. {
  96. XmlElement returnNode = CreateReturnElement(sendDoc, firstChild.Name);
  97. sendRoot.AppendChild(returnNode);
  98. break;
  99. }
  100. case "GetAgentInfo":
  101. {
  102. XmlElement returnNode = CreateReturnElement(sendDoc, firstChild.Name);
  103. sendRoot.AppendChild(returnNode);
  104. XmlElement returnInfoNode = sendDoc.CreateElement("ReturnInfo");
  105. sendRoot.AppendChild(returnInfoNode);
  106. break;
  107. }
  108. default:
  109. Debug.Assert(false);
  110. break;
  111. }
  112. return sendDoc.InnerXml;
  113. }
  114. #region 生成XML数据
  115. private XmlElement CreateReturnElement(XmlDocument doc, string name)
  116. {
  117. XmlElement node = doc.CreateElement("Return");
  118. node.SetAttribute("Type", name);
  119. node.SetAttribute("Value", "0");
  120. node.SetAttribute("Desc", "成功");
  121. return node;
  122. }
  123. private XmlElement CreateRootElement(XmlDocument doc)
  124. {
  125. XmlElement root = doc.CreateElement("Msg");
  126. root.SetAttribute("Version", "3.0");
  127. root.SetAttribute("MsgID", "2");
  128. root.SetAttribute("Type", "MonUp");
  129. root.SetAttribute("DateTime", DateTime.Now.ToString());
  130. root.SetAttribute("SrcCode", "110000D01");
  131. root.SetAttribute("DstCode", "110000G01");
  132. root.SetAttribute("ReplyID", "1000_ID");
  133. return root;
  134. }
  135. private XmlDocument CreateXmlDocument()
  136. {
  137. XmlDocument doc = new XmlDocument();
  138. XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "GB2312", "yes");
  139. doc.AppendChild(dec);
  140. return doc;
  141. }
  142. #endregion
  143. }
  144. }

发表评论

表情:
评论列表 (有 0 条评论,1032人围观)

还没有评论,来说两句吧...

相关阅读