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++已经够复杂的。有人甚至还提出把这个东东引进标准,我觉得基本上不可能的。 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。 Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。 弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。 Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境! 虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。 当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。 以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。 现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
页:
[1]