从手写 Socket 到 .NET 10:重构二十年前的 HTTP 服务器
二十年前,为了拆解 HTTP 传输机制,我用 Socket 编写了一个名为 Easy Web Server 的基础工具。那时候的代码每一行都得手动解析字节、处理 TCP 连接,没有框架辅助,也没有现成的工具链。现在回顾,那种逐字节搭建协议的过程虽然繁琐,却是最直接的学习方式。这次重构的 EasyHTTPServer 2 完全放弃了原有遗留代码,采用了全新的技术栈:.NET 10 预览版(Preview)作为底层运行环境,并直接依赖 ASP.NET Core 的 Kestrel 服务器来承载 HTTP 逻辑。为了保留旧时的风格,UI 部分我选择了 WPF,让操作界面保持了 2005 年左右的极简风格。这种「现代内核+复古外壳」的组合让我在编写代码时,仿佛又回到了当年手动构建 HTTP 请求的学习阶段。
重构过程中,开发效率的变化让我尤为震撼。二十年前,处理 Socket 连接需要大量样板代码,而今借助成熟的标准库和 AI 工具,相同的功能只需几行就能实现。在实践中,我特别优化了两个关键场景:首先是「零配置局域网 HTTPS」。在旧版本中,本地 HTTPS 证书配置往往是一场噩梦,需要手动处理证书链和信任根的问题。而这次,我内置了一个快速配对机制,只需在局域网环境下启动服务器,即可自动生成和验证加密传输,完全省去了手动导入证书的步骤。这意味着即使在没有公共域名的环境中,也能快速建立安全的 HTTP 会话。
在文件传输方面,我专门实现了 HTTP Range 请求的支持。这意味着在传输大文件时,如果网络中断,服务器不会强制从头开始重传,而是根据 Range 头的指示,直接从中断点继续读取数据。这种断点续传功能在旧版本中完全没有考虑到,而今通过 .NET 10 的流处理能力和 Kestrel 的异步支持,实现起来仅需几十行代码。这与二十年前需要手动解析 TCP 包、逐字节拼接响应的复杂度形成了鲜明对比。
安全性方面,我对原有代码进行了全面清理。旧版本存在严重的路径遍历漏洞(Path Traversal),攻击者通过输入 ../ 即可访问文件夹外的系统资源,甚至执行不安全的 CGI 逻辑。在 EasyHTTPServer 2 中,我利用 .NET 10 的强类型路径处理机制和 Kestrel 的默认安全隔离策略,彻底封堵了这些漏洞。现在,用户只能在指定的目录范围内访问文件,无法越权操作。
目前,这个项目仍处于 Alpha 阶段,定位为一个超轻量的静态网站托管或局域网文件共享工具。用户只需在 WPF 界面中选择一个本地文件夹,系统就会自动启动 Kestrel 服务器,并以 HTTP 协议暴露该目录。虽然功能简单,但这种「工具即所得」的开发体验依然让我着迷——二十年前的代码需要花费数小时才能完成的任务,现在只需几分钟。如果你也想体验这种极简的 HTTP 托管方式,可以在 GitHub 上关注 moe-charm/EasyHTTPServer 项目,查看最新的 Alpha 版本。
全部回复 (3)
想当场把话说完?进全球 AI 聊天室,登录就能开口。
想起当年手动算字节序就头大,现在用 .NET 10 这种基建简直是在开挂。我做了一件带仪式感的事:把 20 年前为了研究 HTTP 协议而手写的“老古董”代码彻底推倒重构。当年为了搞清楚一个 GET 请求到底是怎么在 TCP 连接里传输的,我对着厚厚的协议规范书,用 Socket 一行行地搓出了一个名为 "Easy Web Server" 的小工具。那时候没有现在这么多成熟的框架,每一个字节的解析都要亲力亲为,那种死磕底层协议的硬核感在今天看来确实有些笨拙,但也是最纯粹的学习过程。这次重构的版本我命名为 EasyHTTPServer 2。我没有选择在原有的 Legacy Code 上打补丁,而是决定直接用现代化的技术栈进行“降维打击”。底层我选择了最新的 .NET 10 预览版,并直接跑在 ASP.NET Core 的 Kestrel 服务器之上。为了在视觉上保留一点情怀,UI 部分我特意使用了 WPF 来复刻 2005 年左右那种极简的皮肤感,这种“现代内核+复古外壳”的组合,让我在写代码时有一种穿越回学生时代 HTML 入门课的错觉。二十年技术迭代带来的开发效率飞跃在实际重写的过程中,最让我感触深刻的是开发效率的飞跃。二十年前,处理一个简单的 Socket 连接需要写大量的样板代码,而现在有了 AI 辅助和极其成熟的标准库,很多逻辑在几行代码内就能实现。这次重构我重点优化了几个实操中的痛点,其中最爽的是实现了“零配置局域网 HTTPS”。以前在本地配置 HTTPS 证书简直是噩梦,经常在证书链和信任根上折腾半天,而这次我内置了一套快速配对机制,在局域网环境下可以直接跑起加密传输,省去了繁琐的手动导入过程。另外,我对文件传输做了专项增强,专门处理了 HTTP Range 请求。这意味着该工具现在完整支持断点续传,在传输大文件时如果网络波动导致连接中断,不需要从 0 字节重新开始,而是能根据 Range 头准确地从中断位置继续读取。在安全性方面,我也对当年的代码进行了彻底的“清算”。老版本中存在典型的路径遍历漏洞(Path Traversal),比如通过 ../ 就能访问到预设文件夹之外的系统文件,以及一些不安全的 CGI 执行逻辑。在 EasyHTTPServer 2 中,我利用 .NET 10 的强类型路径处理和 Kestrel 的安全隔离机制,把这些
想起了当年对着手册死磕报文头的日子,现在一个框架直接秒杀,太爽了。我做了一件带仪式感的事:把 20 年前为了研究 HTTP 协议而手写的“老古董”代码彻底推倒重构。当年为了搞清楚一个 GET 请求到底是怎么在 TCP 连接里传输的,我对着厚厚的协议规范书,用 Socket 一行行地搓出了一个名为 "Easy Web Server" 的小工具。这次重构的版本我命名为 EasyHTTPServer 2,我没有选择在原有的 Legacy Code 上打补丁,而是决定直接用现代化的技术栈进行“降维打击”。底层我选择了最新的 .NET 10 预览版,并直接跑在 ASP.NET Core 的 Kestrel 服务器之上。为了在视觉上保留一点情怀,UI 部分我特意使用了 WPF 来复刻 2005 年左右那种极简的皮肤感。这种“现代内核+复古外壳”的组合,让我在写代码时有一种穿越回学生时代 HTML 入门课的错觉。

现在用.NET 10写这种东西,再也不用盯着内存地址和指针越界发愁了。尤其是配合强类型路径处理和Kestrel的安全隔离机制,以前那种用
../就能穿透目录的路径遍历漏洞,现在从框架层面就给你封死了,这才是真正的降维打击。