代码:

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. 微服务学习笔记(1)——使用MagicOnion实现gRPC

    原文:微服务学习笔记(1)--使用MagicOnion实现gRPC 1.什么是gRPC 官方文档:https://grpc.io/docs/guides/index.html 2.什么是MagicOn ...

  2. [SVG] Combine Multiple SVGs into an SVG Sprite

    In this lesson, we’ll explore the process of combining all of your SVG icons into one SVG sprite, to ...

  3. 编写Linux中sh文件执行时出现莫名字符的问题

    今天在项目中需要编写一个sh,执行一些初始化操作,然后调取原来的执行文件,但是我在操作中主要到了首行需要加入#!/bin/sh 的表达式,但是在执行时总是报错,原因是每次执行,表达式后边都会添加一个莫 ...

  4. 【Python 安装】安装第三方库时 PermissionError: [WinError 5] Access is denied

    对于 windows 用户,在开始菜单中输入 cmd,右键以 run as administrator(以管理员身份运行). Python - PIP install trouble shooting ...

  5. hello.c内核模块编译 -- linux内核

    Linux开发模块,在本机上看调试信息的方法走通了.当前版本号2.6.32-32-generic uname –r 能够查询 这里取module_param()作为样例. 该宏被定义在include/ ...

  6. 【t029】Mobile Service

    Time Limit: 3 second Memory Limit: 256 MB [问题描述] 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工), ...

  7. linux 分发同步脚本与分发命令脚本

    同步脚本,在第5步要拼接自己配置的主机名 #!/bin/bash # 获取输入参数个数,如果没有参数,直接退出 pcount=$# )); then echo no args; exit; fi # ...

  8. 使用相对路径导入ado库的方法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 常用的导入ado库的语句: #import "c:\program files\common files\s ...

  9. CUDA一维纹理内存

    纹理一词来源于GPU图形世界,GPU通用并行计算"盗用"了纹理一词,定义了一个纹理内存的概念.纹理内存缓存在 设备上,在某些情况下能减少对内存的请求并降低内存带宽的使用,是专门为那 ...

  10. HDOJ 4901 The Romantic Hero

    DP....扫两次合并 The Romantic Hero Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 ...