public class HttpApplication : ... { private HttpContext _context; private HttpSessionState _session;
public HttpSessionState Session { get { HttpSessionState state = null; if (this._session != null) { state = this._session; } else if (this._context != null) { state = this._context.Session; } if (state == null) { throw new HttpException(HttpRuntime.FormatResourceString("Session_not_available"[img]/images/wink.gif[/img]); } return state; } } }
而在 ASP.NET 页面中获取会话的方法也是类似,都是通过 HttpContext 来完成的。 以下内容为程序代码:
public class Page : ... { private HttpSessionState _session; private bool _sessionRetrieved;
public virtual HttpSessionState Session { get { if (!this._sessionRetrieved) { this._sessionRetrieved = true; try { this._session = this.Context.Session; } catch (Exception) { } } if (this._session == null) { throw new HttpException(HttpRuntime.FormatResourceString("Session_not_enabled"[img]/images/wink.gif[/img]); } return this._session; } } }
app.AddOnAcquireRequestStateAsync(new BeginEventHandler(this.BeginAcquireState), new EndEventHandler(this.EndAcquireState)); app.ReleaseRequestState += new EventHandler(this.OnReleaseState); app.EndRequest += new EventHandler(this.OnEndRequest);
// 创建会话管理器 //... }
BeginAcquireState 和 EndAcquireState 作为一个异步处理器注册到 HttpApplication._acquireRequestStateEventHandlerAsync 字段上;OnReleaseState 则负责在合适的时候清理会话状态;OnEndRequest 则是 OnReleaseState 的一个包装,负责较为复杂的请求结束处理。前面提到的 HttpApplication.InitInternal 函数,在完成了初始化工作后,会将上述这些事件处理器,加入到一个执行队列中,由应用程序在合适的时候,使用流水线机制进行调用,最大化处理效率。有关 ASP.NET 中流水线事件模型的相关介绍,请参考 HTTP PIPELINES Securely Implement Request Processing, Filtering, and Content Redirection with HTTP Pipelines in ASP.NET 一文中 The Pipeline Event Model 小节,有机会我在写文章详细分析。