Middleware (2) — Session

1 Overview

Session 的作用是什么呢?我们都知道 Http 协议是无状态的,也就是说每次 Http 请求都是独立的,它们之间不会知道彼此之间的联系。而 Session 的机制可以让 Http 请求存在相关性。

  • Service.AddSession() 设置Session 的信息,比如有效时间是 10 秒钟,客户端的 Cookie 信息
  • app.UseSession 开始使用 Session 这个中间件.
  1. 根据 foobar 作为 SessionKey 去后端的存储的地方通过 load拿到 Session ,如果没有或者 expired 了,这创建这个 Session 对象,并且将这个 Session 作为 HttpContext 的一个 Feature 以便在 HttpContext 中使用
  2. Session 这个中间件执行完毕,调用 Commit 方法,将处理后的数据,保存到后端的存储中

2. SessionOptions

  • IdleTimeout : Session 的有效时间
  • IOTimeOut : Session 在存取的超时时间

3. ISessionStore/DistributedSessionStore

ISessionStoreSession 的存储层,这个接口的 API 的定义如下

ISession Create(string sessionKey, TimeSpan idleTimeout, TimeSpan ioTimeout, Func<bool> tryEstablishSession, bool isNewSessionKey);
Deserialize: byte[] -> Dictionary<EncodedKey,  byte[]>
Serialize: Dictionary<EncodedKey, byte[]> -> byte[]
  • 记录数目: 3 bytes
  • SessionId: 16 bytes
  • 对于每个记录
  • key length: 2 bytes
  • key : n bytes
  • value length: 4 bytes
  • value: n bytes

4. SessionMiddleware

SessionMiddlewareInvoke 方法如下

  • 然后通过 _dataProtector 来加密存放到 cookie 中的值
  • 然后通过 SessionEstablisher 来注册 Response 开始的时候,往 headercookie 写入数据,比如这里的 Session key
  • 将它赋值给 HttpFeatures 中的 ISessionFeature
  • 后续的中间件可以通过 HttpContext.Session 来获得创建的 ISession 对象

A software developer in Microsoft at Suzhou. Most articles spoken language is Chinese. I will try with English when I’m ready

A software developer in Microsoft at Suzhou. Most articles spoken language is Chinese. I will try with English when I’m ready