HttpListener 是 Windows 专用的轻量级 HTTP 服务器,需管理员权限配置 URL 保留,支持同步/异步请求处理、GET 参数解析与简易路由,适合本地调试和嵌入式场景,但不跨平台。
用 HttpListener 实现一个轻量级 Web 服务器,在 C# 中非常直接,适合做本地调试、微服务接口或嵌入式 HTTP 响应场景。它不依赖 IIS 或 Kestrel,开箱即用,但仅支持 Windows(.NET Framework 和 .NET Core/.NET 5+ 在 Windows 上可用)。
Windows 上运行 HttpListener 需要 HTTP 命名空间保留权限(尤其非管理员账户),否则会抛出 AccessDeniedException。可提前执行命令(管理员权限运行):
netsh http add urlacl url=http://+:8080/ user=DOMAIN\username
代码中需引入命名空间:
using System;
using System.IO;
using System.Net;
using System.Text;
核心逻辑是:启动监听 → 等待请求 → 读取并响应 → 关闭连接。注意必须调用 context.Response.Close() 或使用 using 显式释放流,否则连接挂起。
http://localhost:8080/)Start() 开始监听GetContext() 同步等待请求(阻塞,适合简单场景)ContentType 和 ContentLength64(推荐)var listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/");
listener.Start();
Console.WriteLine("Server running at http://localhost:8080/");
while (true)
{
var context = listener.GetContext();
var response = context.Response;
string html = "
context.Request.Url 提供完整 URI,可用 PathAndQuery 区分路径和参数,QueryString 属性自动解析键值对。
http://localhost:8080/api/user?id=123,context.Request.QueryString["id"] 返回 "123"
switch(context.Request.Url.LocalPath) 做简易路由Uri.UnescapeDataString()
GetContext() 是同步阻塞的,一次只能处理一个请求。生产环境建议改用 BeginGe 或更现代的 
GetContextAsync()(.NET Core 2.1+ 支持)。
GetContextAsync() 返回 Task,配合 await 不阻塞主线程IOException),防止整个监听崩溃async Task HandleRequest(HttpListenerContext ctx)
{
try
{
// 处理逻辑...
}
catch (IOException) { /* 客户端意外断开 */ }
finally { ctx.Response.Close(); }
}
基本上就这些。HttpListener 轻巧可控,适合学习 HTTP 底层交互或构建极简后端;若需路由、中间件、HTTPS、跨平台等能力,建议升级到 ASP.NET Core 的 WebHost 或 Minimal API。