本文介紹一個簡潔的 ASP.NET 實作,利用 HttpListener 類別建立一個輕量級的 HTTP 伺服器,能夠攔截傳入的 HTTP 請求並進行自訂處理。這段代碼雖然簡短,卻展示了非同步 I/O 的核心模式,適合作為學習網路程式設計的切入點,或是作為簡單的 Mock Server、Webhook 接收端等場景的基礎框架。
public class HttpServer : IDisposable
{
private HttpListener _listener;
public void Start()
{
_listener = new HttpListener();
_listener.Prefixes.Add("https://localhost/");
_listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication
| AuthenticationSchemes.Anonymous;
_listener.Start();
_listener.BeginGetContext(GetContextCallback, null);
}
private void GetContextCallback(IAsyncResult ar)
{
HttpListenerRequest request;
HttpListenerResponse response;
try
{
var context = _listener.EndGetContext(ar);
request = context.Request;
response = context.Response;
// 立即開始下一輪監聽,實現併發處理
_listener.BeginGetContext(GetContextCallback, null);
}
catch (InvalidOperationException)
{
return; // 監聽器已停止
}
catch (HttpListenerException)
{
return; // 底層網路錯誤
}
try
{
using (var writer = new StreamWriter(response.OutputStream))
{
writer.Write(@"你的請求已經被截取
");
writer.Flush();
}
}
finally
{
response.OutputStream.Flush();
response.Close();
}
}
public void Dispose()
{
_listener?.Stop();
}
}
HttpListener 是 .NET Framework 內建的 HTTP 協議監聽器,無需 IIS 即可直接處理 HTTP 請求。透過 Prefixes 集合註冊 URL 前綴(需管理員權限或預留 URL),支援 Windows 整合驗證與匿名驗證並存。
代碼採用 APM(Asynchronous Programming Model)模式:
BeginGetContext 發起非同步等待,不阻塞執行緒GetContextCallbackBeginGetContext),確保下一個請求能立即被接收,這是高併發的關鍵捕獲 InvalidOperationException(監聽器已停止)與 HttpListenerException(網路層錯誤),避免未處理異常導致進程崩潰。實作 IDisposable 確保資源正確釋放。
async/await 重寫(.NET 4.5+),代碼更易讀這個極簡實作雖然功能有限,但展現了 .NET 底層網路程式設計的精髓,是理解 Kestrel、ASP.NET Core 管線等高階框架的良好起點。