c#使用HttpListener監聽HTTP請求
引用網址: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