|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
是不是实质都是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]主动预编译机制浅析》,以下简称【文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++已经够复杂的。有人甚至还提出把这个东东引进标准,我觉得基本上不可能的。 |
|