CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

您现在的位置: IT专家网 > Web服务子站 > .NET技术

ASP.NET Session 实现会话的建立流程

作者: 佚名,  出处:IT专家网论坛, 责任编辑: 包春林, 
2008-05-23 04:00
  HTTP 协议之所以能够获得如此大的成功,其设计实现的简洁性和无状态连接的高效率是很重要的原因。而为了在无状态的 HTTP 请求和有状态的客户端操作之间达到平衡,产生了服务器端会话 (Session) 的概念。

  客户端在连接到服务器后,就由 Web 服务器产生并维护一个客户端的会话;当客户端通过无状态 HTTP 协议再次连接到服务器时,服务器根据客户端提交的某种凭据,如 Cookie 或 URL 参数,将客户关联到某个会话上。这种思路在各种开发语言和开发环境中大量得到应用。

  在 ASP.NET 中,Web 应用程序和会话状态被分别进行维护,通过 HttpApplication 和 HttpSessionState 分离 Web 应用程序与会话的功能。应用程序层逻辑在 Global.asax 文件中实现,运行时编译成 System.Web.HttpApplication 的实例;会话则作为单独的 System.Web.SessionState.HttpSessionState 实例,由服务器统一为每个用户会话维护,通过 ASP.NET 页面编译成的 System.Web.UI.Page 对象子类的 Session 属性访问。关于 ASP.NET 中不同层次关系可参考我以前的一篇文章《.NET 1.1中预编译ASP.NET页面实现原理浅析 [1] 自动预编译机制浅析》,以下简称【文1】。

  ASP.NET 在处理客户端请求时,首先将根据客户端环境,生成一个 System.Web.HttpContext 对象,并将此对象作为执行上下文传递给后面的页面执行代码。

  在【文1】的分析中我们可以看到,HttpRuntime 在处理页面请求之前,根据 HttpWorkerRequest 中给出的环境,构造 HttpContext 对象,并以次对象作为参数从应用程序池中获取可用应用程序。简要代码如下:

  以下内容为程序代码:

  

      private void HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)

  {

  // 构造 HTTP 调用上下文对象

  HttpContext ctxt = new HttpContext(wr, 0);

  //...

  // 获取当前 Web 应用程序实例

  IHttpHandler handler = HttpApplicationFactory.GetApplicationInstance(ctxt);

  // 调用 handler 实际处理页面请求

  }

  HttpApplicationFactory 工厂内部维护了一个可用的应用程序实例缓冲池,用户降低应用程序对象构造的负荷。

  如果池中没有可用的应用程序对象实例,此对象工厂最终会调用 System.Web.HttpRuntime.CreateNonPublicInstance 方法构造新的应用程序实例,并调用其 InitInternal 方法初始化。详细步骤分析见【文1】

  以下内容为程序代码:

  

      internal static IHttpHandler HttpApplicationFactory.GetApplicationInstance(HttpContext ctxt)

  {

  // 处理定制应用程序

  //...

  // 处理调试请求

  //...

  // 判断是否需要初始化当前 HttpApplicationFactory 实例

  //...

  // 获取 Web 应用程序实例

  return HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(ctxt);

  }

  private HttpApplication HttpApplicationFactory.GetNormalApplicationInstance(HttpContext context)

  {

  HttpApplication app = null;

  // 尝试从已施放的 Web 应用程序实例队列中获取

  //...

  if(app == null)

  {

  // 构造新的 Web 应用程序实例

  app = (HttpApplication)System.Web.HttpRuntime.CreateNonPublicInstance(this._theApplicationType);

  // 初始化 Web 应用程序实例

  app.InitInternal(context, this._state, this._eventHandlerMethods);

  }

  return app;

  }

共5页。 1 2 3 4 5 :

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅

       

该文章的读者还阅读了

天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i