引用網址:https://www.cnblogs.com/ggll611928/p/15726839.html
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

