代码:

using NLog;
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Web;
using System.Xml; namespace MasterCardService
{
public partial class MainService : ServiceBase
{
private static Logger logger = LogManager.GetCurrentClassLogger();
private HttpListener MyListerner; public MainService()
{
InitializeComponent();
} public void DebugStart()
{
OnStart(null);
} protected override void OnStart(string[] args)
{
MyListerner = new HttpListener();
while (true)
{
try
{
MyListerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
MyListerner.Prefixes.Add("http://127.0.0.1:7788/Service/");
MyListerner.Start();
}
catch (Exception ex)
{
logger.Error(ex, "服务器启动失败......");
break;
}
logger.Debug("服务器启动成功......"); //线程池
int minThreadNum;
int portThreadNum;
int maxThreadNum;
ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
logger.Debug("最大线程数:{0}", maxThreadNum);
logger.Debug("最小空闲线程数:{0}", minThreadNum);
//ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x); logger.Debug("\n等待客户连接中......");
while (true)
{
//等待请求连接
//没有请求则GetContext处于阻塞状态
HttpListenerContext ctx = MyListerner.GetContext(); ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc), ctx);
}
}
} protected override void OnStop()
{
MyListerner?.Stop();
} void TaskProc(object obj)
{
HttpListenerContext ctx = (HttpListenerContext)obj; ctx.Response.StatusCode = ;//设置返回给客服端http状态代码 //接收POST参数
Stream stream = ctx.Request.InputStream;
System.IO.StreamReader reader = new System.IO.StreamReader(stream, Encoding.UTF8);
string body = reader.ReadToEnd();
logger.Debug("收到POST数据:\r\n" + HttpUtility.UrlDecode(body)); var replyMsg = ProcessMessage(body); //使用Writer输出http响应代码,UTF8格式
using (StreamWriter writer = new StreamWriter(ctx.Response.OutputStream, Encoding.UTF8))
{
writer.Write(replyMsg);
writer.Close();
ctx.Response.Close();
}
} private string ProcessMessage(string body)
{
XmlDocument recvDoc = new XmlDocument();
recvDoc.LoadXml(body);
XmlNode recvRoot = recvDoc.SelectSingleNode("Msg");
var firstChild = recvRoot.FirstChild; XmlDocument sendDoc = CreateXmlDocument();
XmlElement sendRoot = CreateRootElement(sendDoc);
sendDoc.AppendChild(sendRoot); switch (firstChild.Name)
{
case "AgentInfoSet":
{
XmlElement returnNode = CreateReturnElement(sendDoc, firstChild.Name);
sendRoot.AppendChild(returnNode);
break;
}
case "GetAgentInfo":
{
XmlElement returnNode = CreateReturnElement(sendDoc, firstChild.Name);
sendRoot.AppendChild(returnNode); XmlElement returnInfoNode = sendDoc.CreateElement("ReturnInfo");
sendRoot.AppendChild(returnInfoNode);
break;
}
default:
Debug.Assert(false);
break;
} return sendDoc.InnerXml;
} #region 生成XML数据
private XmlElement CreateReturnElement(XmlDocument doc, string name)
{
XmlElement node = doc.CreateElement("Return");
node.SetAttribute("Type", name);
node.SetAttribute("Value", "");
node.SetAttribute("Desc", "成功"); return node;
} private XmlElement CreateRootElement(XmlDocument doc)
{
XmlElement root = doc.CreateElement("Msg");
root.SetAttribute("Version", "3.0");
root.SetAttribute("MsgID", "");
root.SetAttribute("Type", "MonUp");
root.SetAttribute("DateTime", DateTime.Now.ToString());
root.SetAttribute("SrcCode", "110000D01");
root.SetAttribute("DstCode", "110000G01");
root.SetAttribute("ReplyID", "1000_ID"); return root;
} private XmlDocument CreateXmlDocument()
{
XmlDocument doc = new XmlDocument();
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "GB2312", "yes");
doc.AppendChild(dec); return doc;
}
#endregion
}
}

C#通过HttpListener实现HTTP监听的更多相关文章

  1. 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的

    我们在<服务器在管道中的"龙头"地位>中对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了介绍,为了让读者朋友们对管道中的服务器具有更 ...

  2. C# 利用socekt做到http监听,怎么样才能做到高性能

    c#原始提供了http的监听的类HttpListener,实现了简单的http.文章地址<C# 控制台或者winform程序开启http的监听状态> 但是经过我测试,这个HttpListe ...

  3. C# 控制台或者winform程序开启http的监听状态

    1 public class THttpListener { HttpListener listerner; /// <summary> /// /// </summary> ...

  4. 监听指定端口数据交互(HttpListenerContext )

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

  5. C# http监听之Nancy.net

    通过winform或者是控制台应用程序监听http请求,之前使用的是微软的HttpListener,参考https://www.cnblogs.com/duanjt/p/5566336.html 然后 ...

  6. Win7/Vista/Server2008下VS 环境 调试调用 HTTP.SYS 无法启动监听服务及启动后其他机器无法访问端口

    一. VS调试在Win7(vista系列)操作系统下 HttpListener无法绑定多个 指定IP.端口问题 来自:http://www.cnblogs.com/ryhan/p/4195693.ht ...

  7. .NET下寄宿于控制台的HTTPS监听

    附上原文链接:https://blogs.msdn.microsoft.com/jpsanders/2009/09/29/how-to-walkthrough-using-httplistener-o ...

  8. 【用户交互】APP没有退出前台但改变系统属性如何实时更新UI?监听系统广播,让用户交互更舒心~

    前日,一小伙伴问我一个问题,说它解决了半天都没解决这个问题,截图如下: 大概楼主理解如下: 如果在应用中有一个判断wifi的开关和一个当前音量大小的seekbar以及一个获取当前电量多少的按钮,想知道 ...

  9. Java中用得比较顺手的事件监听

    第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...

随机推荐

  1. 正則表達式基础及java使用

    正則表達式基础 正則表達式语法(1)     普通字符:字母,数字.汉子,下划线以及没有特殊定义的标点符号都是"普通字符".表达式中的普通字符.在匹配一个字符串的时候,匹配与之同样 ...

  2. python property属性

    能够检查參数,一直没注意这个语言特性,忽略了非常多细节,感谢 vitrox class Person( object ): def __init__( self, name ): if not isi ...

  3. #781 – 多个变换执行的顺序问题(Transform Order Matters)

    原文:#781 – 多个变换执行的顺序问题(Transform Order Matters) 原文地址:  https://wpf.2000things.com/2013/03/21/781-tr ...

  4. sql server中触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  5. Hive分析窗体函数之NTILE,ROW_NUMBER,RANK和DENSE_RANK

    開始,依照顺序,生成分组内记录的序列–比方,依照pnum降序排列.生成分组内每天的pnum名次ROW_NUMBER() 的应用场景许多.再比方,获取分组内排序第一的记录等等. SELECT polno ...

  6. 【t006】三角形分形描绘问题

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 分形是以多种概念和方法相互冲击融合为特征的图形.分形所呈现的无穷玄机和美感引发人们去探索.分形使人们觉悟 ...

  7. mysql创建用户、赋予指定权限命令

    1.远程登录mysql mysql -h ip -u root -p 密码 2.创建用户 格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码 ...

  8. react里执行shouldComponentUpdate时返回false的后果

    大家都知道生命周期shouldComponentUpdate返回false时,不会进行后续的渲染,那这个时候state是什么情况呢.我们看一下demo class Toggle extends Rea ...

  9. react持续记录零散笔记

    根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff 这些生命周期在深入项目开发阶段是非常重要的 ...

  10. Android菜鸟的成长笔记(16)——Service简介

    Service是Android四大组件之一 1.Service与Activity的区别在:Service一直在后台运行,没有用户界面. 2.选择Activity与Service的标准:如果某个程序组件 ...