深爱那片海 发表于 2015-1-16 22:36:47

ASP.NET网页编程之ASP.NET Session 完成会话的创建流程

是不是实质都是API?有的好像不只是API那么简单的,有的也是一种框架就像MFC一样。有的还是一种思想(就是做软件的思想)(好像很深奥,其实我也不懂^_^)asp.net|session  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中分歧条理干系可参考我之前的一篇文章《.NET1.1中预编译ASP.NET页面完成道理浅析主动预编译机制浅析》,以下简称【文1】。
  
  ASP.NET在处置客户端哀求时,起首将依据客户端情况,天生一个System.Web.HttpContext工具,并将此工具作为实行高低文传送给前面的页面实行代码。
  在【文1】的剖析中我们能够看到,HttpRuntime在处置页面哀求之前,依据HttpWorkerRequest中给出的情况,机关HttpContext工具,并以次工具作为参数从使用程序池中猎取可用使用程序。扼要代码以下:
  以下内容为程序代码:
  
  privatevoidHttpRuntime.ProcessRequestInternal(HttpWorkerRequestwr)
  {
  //机关HTTP挪用高低文工具
  HttpContextctxt=newHttpContext(wr,0);
  
  //...
  
  //猎取以后Web使用程序实例
  IHttpHandlerhandler=HttpApplicationFactory.GetApplicationInstance(ctxt);
  
  //挪用handler实践处置页面哀求
  }
  
  HttpApplicationFactory工场外部保护了一个可用的使用程序实例缓冲池,用户下降使用程序工具机关的负荷。
  假如池中没有可用的使用程序工具实例,此工具工场终极会挪用System.Web.HttpRuntime.CreateNonPublicInstance办法机关新的使用程序实例,并挪用其InitInternal办法初始化。具体步骤剖析见【文1】
  以下内容为程序代码:
  
  internalstaticIHttpHandlerHttpApplicationFactory.GetApplicationInstance(HttpContextctxt)
  {
  //处置定制使用程序
  //...
  
  //处置调试哀求
  //...
  
  //判别是不是必要初始化以后HttpApplicationFactory实例
  //...
  
  //猎取Web使用程序实例
  returnHttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(ctxt);
  }
  
  privateHttpApplicationHttpApplicationFactory.GetNormalApplicationInstance(HttpContextcontext)
  {
  HttpApplicationapp=null;
  
  //实验从已施放的Web使用程序实例行列中猎取
  //...
  
  if(app==null)
  {
  //机关新的Web使用程序实例
  app=(HttpApplication)System.Web.HttpRuntime.CreateNonPublicInstance(this._theApplicationType);
  
  //初始化Web使用程序实例
  app.InitInternal(context,this._state,this._eventHandlerMethods);
  }
  
  returnapp;
  }
  
  这里的System.Web.HttpApplication.InitInternal函数完成对使用程序工具的初始化事情,包含挪用HttpApplication.InitModules函数初始化HTTP模块(前面将具体先容),并将作为参数传进的HttpContext实例保留到HttpApplication._context字段中。而此HTTP高低文工具将被前面用于猎取会话工具。
  以下内容为程序代码:
  
  publicclassHttpApplication:...
  {
  privateHttpContext_context;
  privateHttpSessionState_session;
  
  publicHttpSessionStateSession
  {
  get
  {
  HttpSessionStatestate=null;
  if(this._session!=null)
  {
  state=this._session;
  }
  elseif(this._context!=null)
  {
  state=this._context.Session;
  }
  if(state==null)
  {
  Throw newHttpException(HttpRuntime.FormatResourceString("Session_not_available");
  }
  returnstate;
  }
  }
  }
  
  而在ASP.NET页面中猎取会话的办法也是相似,都是经由过程HttpContext来完成的。
  以下内容为程序代码:
  
  publicclassPage:...
  {
  privateHttpSessionState_session;
  privatebool_sessionRetrieved;
  
  publicvirtualHttpSessionStateSession
  {
  get
  {
  if(!this._sessionRetrieved)
  {
  this._sessionRetrieved=true;
  try
  {
  this._session=this.Context.Session;
  }
  catch(Exception)
  {
  }
  }
  if(this._session==null)
  {
  Throw newHttpException(HttpRuntime.FormatResourceString("Session_not_enabled");
  }
  returnthis._session;
  }
  }
  }
  
  在HttpContext中,实践上是经由过程一个哈希表保留诸如会话工具之类信息的
  以下内容为程序代码:
  
  publicsealedclassHttpContext:...
  {
  privateHashtable_items;
  
  publicIDictionaryItems
  {
  get
  {
  if(this._items==null)
  {
  this._items=newHashtable();
  }
  returnthis._items;
  }
  }
  
  publicHttpSessionStateSession
  {
  get
  {
  return((HttpSessionState)this.Items["AspSession"]);
  }
  }
  }
  
  而HttpContext.Session所会见的又是哪儿来的呢?这就又必要回到我们后面说起的HttpApplication.InitModules函数。
  
  在.NET安装目次Config子目次下的machine.config界说了全局性的设置信息,而HttpApplication就是利用个中system.web一节的设置信息举行初始化的。
  以下内容为程序代码:
  
  <system.web>
  <httpModules>
  <addname="OutputCache"type="System.Web.Caching.OutputCacheModule"/>
  <addname="Session"type="System.Web.SessionState.SessionStateModule"/>
  <addname="WindowsAuthentication"type="System.Web.Security.WindowsAuthenticationModule"/>
  <addname="FormsAuthentication"type="System.Web.Security.FormsAuthenticationModule"/>
  <addname="PassportAuthentication"type="System.Web.Security.PassportAuthenticationModule"/>
  <addname="UrlAuthorization"type="System.Web.Security.UrlAuthorizationModule"/>
  <addname="FileAuthorization"type="System.Web.Security.FileAuthorizationModule"/>
  <addname="ErrorHandlerModule"type="System.Web.Mobile.ErrorHandlerModule,System.Web.Mobile,Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
  </httpModules>
  </system.web>
  
  httpModules节点指定了HttpApplication必要初始化的模块列表,而在后面提到的HttpApplication.InitModules函数正式依据此列表举行初始化的
  以下内容为程序代码:
  
  privatevoidHttpApplication.InitModules()
  {
  HttpModulesConfigurationcfgModules=((HttpModulesConfiguration)HttpContext.GetAppConfig("system.web/httpModules");
  
  if(cfgModules==null)
  {
  Throw newHttpException(HttpRuntime.FormatResourceString("Missing_modules_config");
  }
  _moduleCollection=cfgModules.CreateModules();
  
  for(inti=0;i<_moduleCollection.Count;i++)
  {
  _moduleCollection.Init(this);
  }
  
  GlobalizationConfigcfgGlobal=((GlobalizationConfig)HttpContext.GetAppConfig("system.web/globalization");
  if(cfgGlobal!=null)
  {
  _appLevelCulture=cfgGlobal.Culture;
  _appLevelUICulture=cfgGlobal.UICulture;
  }
  }
  
  Session节点关于的System.Web.SessionState.SessionStateModule工具将被HttpModulesConfiguration.CreateModules办法机关,并挪用其Init函数初始化。SessionStateModule类实践上就是卖力办理并创立会话,用户完整能够自行创立一个完成IHttpModule接口的类,完成会话的把持,照实现撑持集群的形态同步等等。
  SessionStateModule.Init办法次要卖力machine.config文件中的ses
据说很厉害,甚至可以把C#也干掉^_^,不过也很复杂,本来C++已经够复杂的。有人甚至还提出把这个东东引进标准,我觉得基本上不可能的。

莫相离 发表于 2015-1-19 18:31:56

代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。

再见西城 发表于 2015-1-27 11:56:08

Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。

兰色精灵 发表于 2015-2-5 07:51:38

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

冷月葬花魂 发表于 2015-2-11 08:05:39

Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!

再现理想 发表于 2015-3-2 00:17:53

虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。

柔情似水 发表于 2015-3-11 01:27:07

当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。

若相依 发表于 2015-3-17 18:09:49

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。

活着的死人 发表于 2015-3-24 18:23:37

现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
页: [1]
查看完整版本: ASP.NET网页编程之ASP.NET Session 完成会话的创建流程