YUHAO 的博客

流光飞舞

标签 Web 服务器

2018 年底折扣活动:Packtpub 和 Vultr

眼看就是 8012 年底了,各大厂家不出意外的也在搞各种优惠促销活动。我最近个人比较关注的出版社 Packtpub 前一阵子搞了个 $10 Ebooks and Videos,应该是很受欢迎,所以该社趁着年底又来了一波猛的,这回是 $5 一本,就算折成人民币也平过国内大多数 IT 书籍的价格了,而且数量相当多(参加活动的书籍大概有近 5000 本),有兴趣的朋友不妨去淘一淘(打开 Packt 首页 即可看到)。仍然要多嘴唠叨一句,Packet 社出版的书籍虽然多且新,但质量参差不齐,部分书籍水平不高,购买时请注意鉴别,如果书籍页面下方有差评的就要留心了。当然了,$5 的价格就算买到了次品也不至于太过肉痛。

用 C# 自己动手编写一个 Web 服务器,第六部分——用户验证

C#
Web

用户验证和授权

上一篇文章中,我们添加了视图引擎支持,可以输出真正的动态页面了。再加上控制器(Controller)的支持,现在应用程序开发者可以自由执行业务逻辑,并输出想要的页面效果,可以说,一个真正的 Web 服务器已经基本成型了。不过,大多数业务系统还需要用户验证(Authentication)和授权(Authorization)的功能,允许用户在系统中登录和注销,并根据用户权限判断他(她)能够执行的操作。

2

用 C# 自己动手编写一个 Web 服务器,第四部分——Session

C#
Web

Session

上一篇文章 中,我们实现了 Web 服务器的路由功能,并实现了控制器的基本支持。本来,我们应该高高兴兴的继续向其中添加功能,不过马上就发现一个尴尬的问题————我们还没有 Session。更具体的说,我们一直在使用的 HttpListenerContext 只提供了 Request/Response,却没有 Session 属性。这意味着我们的服务器毫无记性,只能把每次请求都当作新的用户。

用 C# 自己动手编写一个 Web 服务器,第五部分——视图引擎

C#
Web

视图引擎

上一篇文章 中,我们实现了 Session,并在过程中为 HttpListenerContext 提供了更高层的封装。在 Controller 返回的结果中我们可以看到服务器动态执行的结果,不过目前它们是以原始字符串的形式存在的。从基本原理来说,返回字符串并没有什么不妥————互联网早期的 CGI/Servlet 都是这么做的。问题在于这种接口过于底层了。设计者希望看到 HTML 页面,而不是苦哈哈的自己去拼接字符串。这就是视图引擎(View Engine)存在的理由。

1

用 C# 自己动手编写一个 Web 服务器,第三部分——路由

C#
Web

路由(Routing)

上一篇文章 中,我们将 Web 服务器的功能拆分成一系列较小的中间件(Middleware),建立起一个灵活、可扩展的架构。但目前的中间件只提供了静态文件支持,还没有任何动态功能。

对于绝大多数现代 Web 服务器来说,路由(Routing)都是其中核心的部分。按照企业应用架构模式的分类,路由应该属于其中的“前端控制器”(Front controller),主要目的是将接收到的 HTTP 请求分发到相应的后端业务模块去处理。而分发规则主要是基于请求的信息(路径、HTTP方法、头部信息、Cookie等)。虽然总体思路是相似的,但各个语言或编程框架声明路由的方式还是相差很大。例如,Nodejs 框架 Express 要求你显式声明路由对应的方法:

用 C# 自己动手编写一个 Web 服务器,第一部分——基础

C#
Web
用 C# 自己动手编写一个 Web 服务器,第一部分——基础

市场上已经有如此之多的 Web 服务器,为什么还要自己写一个?这对真正的黑客来说其实是个无需回答的问题。不过,即便你自认是个小白,也无需被题目吓倒——现代的语言和框架已经为我们提供了非常强大的基础设施,我们用很少的代码就能搭建起一个基础的 Web 服务器。事实上,我们下面要介绍的第一版程序核心代码经过完整的封装、并且提供了静态文件处理,而核心代码也不过 70 行左右,如果你只想要一个静态文件服务器,那么你完全可以把代码压缩到 40 行,而且这些代码非常容易理解。