|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
计算机发展到这个时候,很多技术日益成熟,想学好一种技术都是不容易的,当你学会用的时候你对它的很多原理可能很不了解)asp.net|架构 在这里我们有一个在ISAPI扩大中举动的,可挪用的ISAPIRuntime工具的实例。每次运转时是启动的并运转着的时分(译注:绝对的,假如运转时并没有启动,就必要象上一章所说的那样载进运转时),ISAPI的代码挪用ISAPIRuntime.ProcessRequest()办法,这个办法是真实的进进ASP.NET管道的出口,这个流程在中显现。
记着ISAPI是多线程的,以是哀求也会经由过程AppDomainFactory.Create()(译注:原文为ApplicationDomainFactory,疑有误)函数中前往的援用在多线程情况中被处置.列表1显现了ISAPIRuntime.ProcessRequest()办法中反编译后的代码,这个办法吸收一个ISAPIecb工具和服务范例(WorkerRequestType)作为参数.这个办法是线程平安的, 以是多个ISAPI线程能够同时在这一个被前往的工具实例上平安的挪用这个办法。
列表1:ProcessRequest办法吸收一个ISAPIEcb并将其传给事情线程
publicintProcessRequest(IntPtrecb,intiWRType)
{
HttpWorkerRequestrequest1=ISAPIWorkerRequest.CreateWorkerRequest(ecb, iWRType);
stringtext1=request1.GetAppPathTranslated();
stringtext2=HttpRuntime.AppDomainAppPathInternal;
if(((text2==null)||text1.Equals("."))||
(string.Compare(text1,text2,true,CultureInfo.InvariantCulture)==0))
{
HttpRuntime.ProcessRequest(request1);
return0;
}
HttpRuntime.ShutdownAppDomain("Physicalapplicationpathchangedfrom"+text2+"to"+text1);
return1;
}
这里实践的代码其实不主要, 记着这是从外部框架代码中反编译出来的, 你不克不及间接处置它, 它也有大概在未来产生改动.它只是用来展现在幕后产生了甚么.ProcessRequest办法吸收非托管的ECB援用并将它传送给ISAPIWorkerRequest工具, 此工具卖力为以后哀求创立创立哀求高低文.在列表2中显现了这个历程.
System.Web.Hosting.ISAPIWorkerRequest类是HttpWorkerRequest类的一个笼统子类(译注:HttpWorkerRequest和ISAPIWorkerRequest都是笼统类, 而且ISAPIWorkerRequest承继自HttpWorkerRequest),它的事情是构建一个作为Web使用输出的输出输入的笼统视角。注重这里有另外一个工场办法:CreateWorkerRequest, 经由过程判别承受到的第二个参数来创立对应的WorkerRequest工具.有三个分歧的版本:ISAPIWorkerRequestInProc,ISAPIWorkerRequestInProcForIIS6, ISAPIWorkerRequestOutOfProc.每次有哀求进进,这个工具被创立并作为哀求和呼应工具的基本,它会吸收它们的数据和由WorkerRequest供应的数据流.
笼统的HttpWorkerRequest类在低层接口上供应一个高层的笼统,如许就封装了数据是从那里来的,能够是一个CGIWeb服务器,Web扫瞄器控件大概是一些你用来给HTTP运转时”喂”数据的自界说的机制.关头是ASP.NET能用一致的办法来吸收信息。
在利用IIS的情形下, 这个笼统是创建在ISAPIECB块四周.在我们的哀求处置过程当中, ISAPIWorkerRequest挂起ISAPIECB并依据必要从它那边掏出信息.列表2显现了哀求字符串值(querystringvalue)是怎样被掏出来的.
列表2:利用非托管数据的ISAPIWorkerRequest办法
//***ImplementedinISAPIWorkerRequest
publicoverridebyte[]GetQueryStringRawBytes()
{
byte[]buffer1=newbyte[this._queryStringLength];
if(this._queryStringLength>0)
{
intnum1=this.GetQueryStringRawBytesCore(buffer1,this._queryStringLength);
if(num1!=1)
{
thrownewHttpException("Cannot_get_query_string_bytes");
}
}
returnbuffer1;
}
//***ImplementedinaspecificimplementationclassISAPIWorkerRequestInProcIIS6
internaloverrideintGetQueryStringCore(intencode,StringBuilderbuffer,intsize)
{
if(this._ecb==IntPtr.Zero)
{
return0;
}
returnUnsafeNativeMethods.EcbGetQueryString(this._ecb,encode,buffer,size);
}
ISAPIWorkerRequest完成了一个高条理的包装办法, 它挪用了低层的中心办法, 卖力真实的会见非托管APIs-或称为”服务级其余完成”(servicelevelimplementation).这些中心办法在特别的ISAPIWorkerRequest子类中为它投止的情况供应特别的完成, 这完成了复杂的扩大的(pluggable)情况, 如许一来当今后新的Web服务器接口或其他平台成了ASP.NET的方针时附加的完成类能够在被复杂的供应出来。这里另有一个帮忙类(helperclass)System.Web.UnsafeNativeMethods.内里很多对ISAPIECB布局的操纵完成了对ISAPI扩大的非托管操纵。刚刚打开这篇专题,猛然见到HAL9000发表的《对于大型公司项目平台选择j2ee的几层认识》系列,深受启发。 |
|