用 C# 自己动手编写一个 Web 服务器,第四部分——Session
Session
在 上一篇文章 中,我们实现了 Web 服务器的路由功能,并实现了控制器的基本支持。本来,我们应该高高兴兴的继续向其中添加功能,不过马上就发现一个尴尬的问题————我们还没有 Session。更具体的说,我们一直在使用的 HttpListenerContext 只提供了 Request/Response,却没有 Session 属性。这意味着我们的服务器毫无记性,只能把每次请求都当作新的用户。
在 上一篇文章 中,我们实现了 Web 服务器的路由功能,并实现了控制器的基本支持。本来,我们应该高高兴兴的继续向其中添加功能,不过马上就发现一个尴尬的问题————我们还没有 Session。更具体的说,我们一直在使用的 HttpListenerContext 只提供了 Request/Response,却没有 Session 属性。这意味着我们的服务器毫无记性,只能把每次请求都当作新的用户。
在 上一篇文章 我们创建了一个具有基本静态文件服务功能的 Web 服务器,但是还没有动态功能的支持。我们希望在这个程序的基础上进一步扩充,成为具有完整功能的动态 Web 服务器。不过先别忙着写代码,让我们从架构的层次上考虑一下 Web 框架应该是什么样的。
在 上一篇文章 中,我们将 Web 服务器的功能拆分成一系列较小的中间件(Middleware),建立起一个灵活、可扩展的架构。但目前的中间件只提供了静态文件支持,还没有任何动态功能。
对于绝大多数现代 Web 服务器来说,路由(Routing)都是其中核心的部分。按照企业应用架构模式的分类,路由应该属于其中的“前端控制器”(Front controller),主要目的是将接收到的 HTTP 请求分发到相应的后端业务模块去处理。而分发规则主要是基于请求的信息(路径、HTTP方法、头部信息、Cookie等)。虽然总体思路是相似的,但各个语言或编程框架声明路由的方式还是相差很大。例如,Nodejs 框架 Express 要求你显式声明路由对应的方法:
市场上已经有如此之多的 Web 服务器,为什么还要自己写一个?这对真正的黑客来说其实是个无需回答的问题。不过,即便你自认是个小白,也无需被题目吓倒——现代的语言和框架已经为我们提供了非常强大的基础设施,我们用很少的代码就能搭建起一个基础的 Web 服务器。事实上,我们下面要介绍的第一版程序核心代码经过完整的封装、并且提供了静态文件处理,而核心代码也不过 70 行左右,如果你只想要一个静态文件服务器,那么你完全可以把代码压缩到 40 行,而且这些代码非常容易理解。
我在之前的文章 为 JetBrains 系列 IDE 设置背景图片 曾经抱怨过,JetBrains 系列 IDE 已经有设置背景图的功能,但不知道为什么没有把它开放出来。就在今天早上,JetBrains 家族产品从 2017.2.x 系列更新到了 2017.3,其中的变化之一就是终于把这个设置放开了(如下图所示)。
最近知乎上有几个邀请我的关于网络爬虫的问题。我看到了,但是并没有心情去回答。说实话,我的心情挺糟糕的。爬网站 -》 反爬 -》 反反爬......一直是爬虫界生生不息的主题,但是现在的反爬手段已经变态到这种程度,足以说明:爬虫这个行当,快要被某些人玩坏了。
最近在作一个接入支付的项目,支付类型包括支付宝和微信支付。我是一个懒人,写代码的原则是:只要官方有 SDK 可用的话就尽量用官方的,除非万不得已不要自己写。微信支付当然也是有 SDK 的(地址在这里)。但是打开以后想要引用的时候,我有点被其不专业程度 shock 到了。按照道理,像支付这样涉及钱包问题的接口,即便不包含任何服务器逻辑,也应该作得比较严谨和正规吧,但微信支付的 SDK(.Net版) 却只能算新手级别的。这样的 SDK 微信你好意思拿出来让客户用吗?
从今年 5 月算到现在,我的博客已经创建整整半年时间了。虽然搭建一个博客谈不上有什么难度,但自己的网站就是用来折腾的,所以博客背后的引擎也在这半年时间里也更换过好几次了。在这里,我把自己使用各种博客技术框架的经历和自己的一些心得体会记录下来,希望能对同样想自己搭建博客的同学有所参考吧。