1. 程式人生 > 其它 >c#使用HttpListener監聽HTTP請求

c#使用HttpListener監聽HTTP請求

引用網址:https://www.cnblogs.com/ggll611928/p/15726839.html

HttpListener提供一個簡單的、可通過程式設計方式控制的 HTTP 協議偵聽器。通過它可以很容易的提供一些Http服務,而無需啟動IIS這類大型服務程式。

注意:該類僅在執行 Windows XP SP2 或 Windows Server 2003 作業系統的計算機上可用。

 

 

使用Http服務一般步驟如下:

  1. 建立一個HTTP偵聽器物件並初始化
  2. 新增需要監聽的URI 字首
  3. 開始偵聽來自客戶端的請求
  4. 處理客戶端的Http請求
  5. 關閉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