PicoServer

当“杀鸡用牛刀”成为常态,我们是否还有更务实的选择?

一、我们在什么场景下需要“轻量级”?

  • 场景 A:一个运行多年的 WinForms 程序,想给它加个 Web 配置页面。甚至想基于它做个中小型管理后台——用户登录、数据看板、配置管理。
  • 场景 B:一个控制台工具,想对外提供健康检查接口,方便监控集成。

用 ASP.NET Core 做这些事情,你需要创建 Web 项目、配置 Kestrel、理解依赖注入和中间件……程序体积膨胀到 100 MB 以上,内存占用远高于业务本身。

这就是轻量级 Web 服务器要解决的问题:让 .NET 应用“顺便”拥有 Web 能力,而不是被框架绑架。

二、有哪些可选方案?

方案 定位 体积 内存 嵌入现有程序 维护状态
PicoServer Web 能力“胶水库” ~50 KB ~16 MB ✅ 任意项目 ✅ 活跃
PicoServer.Nano 物联网移植版 极轻 极低 ✅ ESP32/STM32 ✅ 活跃
ASP.NET Core 最小 API 官方轻量写法 ~100 MB+ ~100 MB+ ❌ 需建 Web 项目 ✅ 活跃
NancyFX Low‑ceremony 框架 中等 中等 可自宿主 ❌ 已停滞
GenHTTP 模块化嵌入式服务器 中等 中等 可嵌入 ✅ 活跃
EmbedIO 功能型嵌入式服务器 中等 中等 可嵌入 ❌ 已停滞

三、各方案详解

3.1 PicoServer

定位:.NET 轻量级 Web 能力“胶水库”——把 Web 能力“粘”到任意 .NET 应用上。

三行代码启动

var server = new WebAPIServer();
server.AddRoute("/", (req, rsp) => rsp.WriteAsync("Hello"));
server.StartServer();

WinForms、WPF、Avalonia、MAUI、控制台、Windows 服务——只要 .NET 能跑,它就能嵌入。不依赖任何 UI 框架,这是刻意设计。同样刻意的是对 VB.NET 的完整支持,C# 和 VB.NET 开发者都能享受一致的体验。

同一端口提供多种能力

server.MapGet("/api/status", GetStatus);
server.enableWebSocket = true;           // WebSocket 双向通信
server.AddStaticFiles("/", "wwwroot");   // 静态文件 + SPA fallback

此外还原生支持 SSE(Server‑Sent Events),适合 IoT 设备报警、消息通知等轻量级单向推送场景;CORS 配置一行搞定,前后端分离无压力。

安全开箱即用

server.AddJwtTokenVerify("your-key");  // 支持国密 SM3
server.RouteWhiteList.Add("/api/login");

性能实测(笔记本电池供电,零调优)

场景 并发 QPS P99
短连接压力 100 55,117 5.3ms
短连接稳定 50 69,487 1.9ms
WebSocket 10,000 - 内存 398MB

架构特点:底层复用 .NET 官方的 HttpListener,这是一个刻意选择——不自己实现 HTTP 协议,安全更新、跨平台兼容由微软保障。

局限:特性路由不支持 {id} 路径参数;不适合 HTTP/2 推送、HTTP/3 等高级场景。

3.2 ASP.NET Core 最小 API

定位:微软官方的轻量级开发模式,降低 ASP.NET Core 入门门槛。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello");
app.Run();

优势:官方背书,生态完整。OpenAPI、gRPC、SignalR 无缝集成;HTTP/2、HTTP/3 支持;从最小 API 可平滑过渡到完整 MVC。

问题:本质还是创建 Web 项目,无法嵌入现有 WinForms/WPF 程序;空项目内存 ~100 MB;需要理解 DI、中间件管道。

适合:从头开始的微服务、云原生应用。

3.3 NancyFX

定位:2012 年开源的第三方框架,设计理念“Low‑ceremony”(低仪式感)。

public class SampleModule : NancyModule
{
    public SampleModule()
    {
        Get["/"] = _ => "Hello World!";
    }
}

历史贡献:自宿主能力(不依赖 IIS);模块化设计;内容协商、模型绑定、依赖注入内置。

现实问题:2019 年后完全停更;不支持 .NET Core 3.1+;安全漏洞无人修复。

结论:老项目可维持,新项目不要选

3.4 EmbedIO

定位:与 PicoServer 最接近的竞品,主打“给现有程序嵌入 Web 服务”。

using (var server = new WebServer(8090))
{
    server.WithWebApi("/api", api => api.RegisterController<UserController>());
    server.Run();
}

特点:支持 Web API、WebSocket、静态文件;模块化设计;可作为 ASP.NET Core 的宿主。

问题:最后一次更新 2022 年 10 月;依赖内部 SWAN 库,体积较大;不再维护。

结论:曾经是好选择,现在不推荐。

3.5 GenHTTP

定位:模块化嵌入式服务器,注重性能。

var host = Host.Create()
    .Handler(HandlerLayout.Create()
        .AddWebApi<ApiController>());
host.Start();

优势(来自公开基准测试):

  • 文件上传内存占用 862 MB(ASP.NET Core 为 23 GB)
  • JSON 序列化 QPS 高 13-28%
  • 混合负载 + DB 查询快 20-49%

局限:抽象模型独特,需专门学习;仅支持 HTTP/1.1;生态较小。

适合:对上传、JSON 性能有极致要求的场景。

3.6 PicoServer.Nano

定位:PicoServer 的物联网移植版,基于 .NET nanoFramework。

// 在 ESP32 上运行,API 与标准版完全一致
var server = new WebAPIServer();
server.AddRoute("/hello", (req, res) => res.Write("Hello from ESP32!"), "GET");
server.StartServer(80);

设计上避免使用反射,进一步降低资源占用;支持自定义中间件、SSE 推送、Token 认证。实测 ESP32-S3(PSRAM)QPS 约 26,稳定并发 6,成功率 100%。一套 API,贯穿云、边、端

四、对比总结

维度 PicoServer ASP.NET Core 最小 API NancyFX EmbedIO GenHTTP
体积 ~50 KB ~100 MB+ 中等 中等 中等
内存 ~16 MB ~100 MB+ 中等 中等 中等
嵌入现有程序 ✅ 任意项目 ❌ 需建 Web 项目 ✅ 可自宿主 ✅ 可嵌入 ✅ 可嵌入
维护状态 ✅ 活跃 ✅ 活跃 ❌ 停滞 ❌ 停滞 ✅ 活跃
学习成本 极低 中高
VB.NET 支持 ✅ 原生
WebSocket ✅ 原生 ✅ 需配置 需扩展 ✅ 支持 有限
SSE 推送 ✅ 原生 ✅ 需配置 需扩展 ✅ 支持 有限
静态文件 + SPA ✅ 一行代码 ✅ 需配置 ✅ 支持 ✅ 支持 需配置
CORS ✅ 一行代码 ✅ 需配置 需扩展 ✅ 支持 需自行实现
JWT 认证 ✅ 一行代码 ✅ 需配置 需扩展 ✅ 支持 需自行实现
HTTP/2 部分支持 ✅ 完整
国密 SM3 ✅ 原生

五、怎么选?

你的需求是什么?
│
├── 给现有 .NET 程序加 Web 能力(WinForms/WPF/Avalonia/MAUI/Console/服务)
│   └── PicoServer
│
├── 在 ESP32/STM32 上用 C# 提供 Web 服务
│   └── PicoServer.Nano
│
├── 从头开发微服务,需要 HTTP/2、OpenAPI、完整生态
│   └── ASP.NET Core 最小 API
│
├── 文件上传服务,追求极致内存效率
│   └── GenHTTP
│
├── 项目已深度使用 NancyFX 且运行稳定
│   └── 可维持,但新功能建议迁移
│
└── 需要同时服务 C# 和 VB.NET 两种技术栈的项目
    └── PicoServer(唯一原生支持双语的轻量方案)

六、总结

选型时容易被功能和性能数字吸引,但真正决定长期体验的是维护状态是否贴合你的真实场景

  • NancyFX 和 EmbedIO:功能再好,停更后就是技术债务。
  • ASP.NET Core:官方方案最稳妥,但重量级摆在那里,适合从头写 Web 项目。
  • GenHTTP:性能惊艳,但学习成本和 HTTP/1.1 限制需要考虑。
  • PicoServer:轻量、活跃、够用。它不取代 ASP.NET Core,而是填补“大型框架进不去”的地方:老旧系统、桌面程序、边缘设备、物联网单片机。

如果你正在面临以下问题:

  • 给 WinForms/Avalonia/MAUI 程序加 Web 接口
  • .NET Framework 老旧系统快速 Web 化
  • 需要同时支持 C# 和 VB.NET 开发团队
  • 想用 C# 在 ESP32 上写 Web 服务
  • 快速原型验证,后续可能迁移

PicoServer 值得一试。


官网:https://picoserver.cn | NuGet:PicoServer / PicoServer.Nano

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐