代码:

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. ASP.net 中 OutputCache 指令各个参数的作用。

    使用@ OutputCache指令 使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要.@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明.这种方式非 ...

  2. 【codeforces 546A】Soldier and Bananas

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  3. 子查询及exists

    子查询分为无关子查询和相关子查询 无关子查询,只查询一次,与外查询无关,可作为查询条件: select * from student where sno in (select sno from stu ...

  4. 过滤Filter推断用户是否登录

    WEB.XML <!-- 用户session的 键 sessionKEY --> <context-param> <param-name>userSessionKe ...

  5. 【77.39%】【codeforces 734A】Anton and Danik

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. 什么是“恶意代码”——————【Badboy】

    恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到还有一段程序中,从而达到破坏被感染电脑数据.执行具有入侵性或破坏性的程序.破坏被感染电脑数据的安全性和完整性的目的. 按传播方式,恶意代码能够分 ...

  7. parfor —— matlab 下的并行循环

    parfor:parallel for 循环 我们知道,matlab 更适合的处理对象是矩阵,而不是大规模的循环运算.当有时不得不使用 for 循环时,如果提高 for 循环的执行效率呢.这就是 pa ...

  8. Git命令小总结

    常用 git init git 初始化 git clone https://github.com/wsxx111/thisStudy.git 从远端拉下来 git status 查看跟踪状态 git ...

  9. Eclipse中设置自定义文档签名

    今天第一次认真学习eclipse的使用,看到自定义文档签名,步骤如下: 1.点击window->preferences->java->Code Style->Code Temp ...

  10. HPC —— 高性能计算

    CUDA,目前只有 NVIDIA 支持: OpenCL,CUDA Tesla 卡很贵: 1. 术语及概念 SMP:"对称多处理"(Symmetrical Multi-Process ...