HttpListener提供一个简单的、可通过编程方式控制的 HTTP 协议侦听器。通过它可以很容易的提供一些Http服务,而无需启动IIS这类大型服务程序。
注意:该类仅在运行 Windows XP SP2 或 Windows Server 2003 操作系统的计算机上可用。
使用Http服务一般步骤如下:
-
创建一个HTTP侦听器对象并初始化
-
添加需要监听的URI 前缀
-
开始侦听来自客户端的请求
-
处理客户端的Http请求
-
关闭HTTP侦听器
其中3,4两步可以循环处理,以提供多客户多次请求的服务。
第一步:创建一个HTTP侦听器对象
创建HTTP侦听器对象只需要新建一个HttpListener对象即可。
HttpListener listener = new HttpListener();
第二步:初始化
添加需要监听的URL范围至listener.Prefixes中,可以通过如下函数实现:
listener.Prefixes.Add(prefix) //prefix必须以'/'结尾
调用listener.Start()实现端口的绑定,并开始监听客户端的需求。
第三步:接受HTTP请求
在.net2.0中,通过HttpListenerContext对象提供对HttpListener类使用的请求和响应对象的访问。
获取HttpListenerContext的最简单方式如下:
HttpListenerContext context = listener.GetContext();
该方法将阻塞调用函数至接收到一个客户端请求为止,如果要提高响应速度,
可使用异步方法listener.BeginGetContext()来实现HttpListenerContext对象的获取。
第四步:处理HTTP请求
获取HttpListenerContext后,可通过Request属性获取表示客户端请求的对象,通过Response属性取表示 HttpListener 将要发送到客户端的响应的对象。
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
这里的HttpListenerRequest对象和HttpListenerResponse对象和Asp中的Request和Response的使用方式类似,这里就不多说了,具体的使用可以参看下面的例子。
第五步:关闭HTTP侦听器
通过调用listener.Stop()函数即可关闭侦听器,并释放相关资源
根据网上的资源,编写的简单测试代码,以供大家一起学习,源码在最下面可下载
基本变量
private HttpListener _listener;
控制监听HTTP请求
#region 控制监听 //开启监听 private void btnStart_Click(object sender, EventArgs e) { //获取监听的多个地址 string ipAddress1 = txtIPAddress1.Text.Trim(); string ipAddress2 = txtIPAddress2.Text.Trim(); // 注意前缀必须以 / 正斜杠结尾 string[] prefixes = new string[] { ipAddress1, ipAddress2 }; HttpListenerServer httpListenerServer = new HttpListenerServer(); try { // 检查系统是否支持 if (!HttpListener.IsSupported) { throw new ArgumentException("使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!"); } else { if (prefixes == null || prefixes.Length == 0) throw new ArgumentException("缺少地址参数:prefixes"); else { //启动监听 // 创建监听器. _listener = new HttpListener(); httpListenerServer.Start(_listener, prefixes); lblListen.Text = "启用HttpListener监听成功!"; } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } //关闭监听 private void btnClose_Click(object sender, EventArgs e) { if (_listener != null) { _listener.Close(); lblListen.Text = "停止HttpListener监听成功!"; } } #endregion
处理HTTP请求数据
using Newtonsoft.Json.Linq; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace WFHttpServer { /// <summary> /// 通过HttpListener实现简单的http服务器 /// </summary> public class HttpListenerServer { /// <summary> /// 启动监听 /// </summary> /// <param name="prefixes">监听的多个地址</param> public void Start(HttpListener _listener, string[] prefixes) { // 增加监听的前缀 foreach (string s in prefixes) _listener.Prefixes.Add(s); _listener.Start(); //开始监听 _listener.BeginGetContext(GetContextCallBack, _listener); } private void GetContextCallBack(IAsyncResult ar) { try { HttpListener _listener = ar.AsyncState as HttpListener; if (_listener.IsListening) { HttpListenerContext context = _listener.EndGetContext(ar); _listener.BeginGetContext(new AsyncCallback(GetContextCallBack), _listener); #region 解析Request请求 HttpListenerRequest request = context.Request; string content = ""; switch (request.HttpMethod) { case "POST": { Stream stream = context.Request.InputStream; StreamReader reader = new StreamReader(stream, Encoding.UTF8); content = reader.ReadToEnd(); //模拟接受的数据:将接收的字符串内容进行json反序列号为对象 TestValue tv = JsonConvert.DeserializeObject<TestValue>(content); //根据需求做相应操作 } break; case "GET": { var data = request.QueryString; } break; } #endregion #region 构造Response响应 HttpListenerResponse response = context.Response; response.StatusCode = (int)HttpStatusCode.OK; response.ContentType = "application/json;charset=UTF-8"; response.ContentEncoding = Encoding.UTF8; response.AppendHeader("Content-Type", "application/json;charset=UTF-8"); //模拟返回的数据:Json格式 var abcOject = new { code = "200", description = "success", data = "time=" + DateTime.Now }; string responseString = JsonConvert.SerializeObject(abcOject, new JsonSerializerSettings() { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii }); using (StreamWriter writer = new StreamWriter(response.OutputStream, Encoding.UTF8)) { writer.Write(responseString); writer.Close(); response.Close(); } #endregion } } catch (Exception ex) { throw new ArgumentException(ex.Message); } } } //用于json反序列化获取的测试实体类 public class TestValue { public int id { get; set; } public string name { get; set; } } }
运行效果
1、启动服务
2、postman测试
第一个地址测试
第二个地址测试
源码下载:源码
本文引自:
https://blog.csdn.net/qq_36702996/article/details/78892380
https://blog.csdn.net/lordwish/article/details/86615077
https://www.cnblogs.com/wlitsoft/archive/2012/04/25/2469524.html