|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。asp.net|架构 HttpApplication触发事务来关照你的程序有事产生,以此来卖力哀求流转.这作为HttpApplication.Init()函数的一部分产生(用Reflector检察System.Web.HttpApplication.InitInternal()办法和HttpApplication.ResumeSteps()办法来懂得更多概况),一连设置并启动一系列事务,包含实行一切的处置器(handler).这些事务处置器映照到global.asax中主动天生的哪些事务中,同时它们也映照到一切附加的HttpModule(它们实质上是HttpApplication对外公布的分外的事务吸收器(sink)).
HttpModule和HttpHandler二者都是依据Web.config中对应的设置主动态载进并附加到事务处置链中.HttpModule实践上是事务处置器,附加到特别的HttpApplication事务上,但是HttpHandler是用来处置”使用级哀求处置”的尽头.
HttpModule和HttpHandler二者都是在HttpApplication.Init()函数挪用的一部分中被载进并附加到挪用链上.显现了分歧的事务,它们是什么时候产生的和它们影响管道的哪一部分.
-事务在ASP.NEThttp管道中流转的历程.HttpApplication工具的事务驱动哀求在管道中流转.HttpModule能够拦阻这些事务并掩盖大概扩大现有的功效.
HttpContext,HttpModules和HttpHandlers
httpApplication它自己对发送给使用程序的数据一窍不通-它只是一个经由过程事务来通信的动静工具.它触发事务并经由过程HttpContext工具来向被挪用函数传送动静.实践确当前哀求的形态数据由后面提到的HttpContext工具保护.它供应了一切哀求专有的数据并从进进管道入手下手到停止一向跟从哀求.显现了ASP.NET管道中的流程.注重高低文工具(即HttpContext),这个从哀求入手下手到停止一向都是你”伴侣”的工具,能够在一个事务处置函数中保留信息并在今后的事务处置函数中掏出.
一旦管道被启动,HttpApplication入手下手象图六那样一个个的触发事务.每一个事务处置器被触发,假如事务被挂接,这些处置器将实行它们本人的义务.这个处置的次要义务是终极挪用挂接到此特定哀求的HttpHandler.处置器(handler)是ASP.NET哀求的中心处置机制,一般也是一切使用程序级其余代码被实行的中央.记着ASP.NET页面和Web服务框架都是作为HttpHandler完成,这里也是处置哀求的的中心的地方.模块(module)趋势于成为一个传送给处置器(handler)的高低文的预处置或后处置器.ASP.NET中典范的默许处置器包含预处置的认证,缓存和后处置中各类分歧的编码机制.
有良多关于HttpHandler和HttpModule的可用信息,以是为了坚持这篇文章在一个公道的长度,我将供应一个关于处置器的提要先容.
HttpModule
当哀求在管道中传送时,HttpApplicaion工具中一系列的事务被触发.我们已看到这些事务在Global.asax中作为事务被公布.这类办法是特定于使用程序的,大概其实不老是你想要的.假如你要创建一个通用的可用被拔出任何Web使用程序的HttpApplication事务钩子,你可用利用HttpModule,这是可复用的,不必要特定语使用程序代码的,只必要web.config中的一个条目.
模块实质上是过滤器(fliter)-功效上相似于ISAPI过滤器,可是它事情在ASP.NET哀求级别上.模块同意为每一个经由过程HttpApplication工具的哀求挂接事务.这些模块作为内部程序会合的类存贮.,在web.config文件中被设置,在使用程序启动时被载进.经由过程完成特定的接口和办法,模块被挂接到HttpApplication事务链上.多个HttpModule可用被挂接在不异的事务上,事务处置的按次取决于它们在Web.config中声明的按次.上面是在Web.config中处置器界说.
<configuration>
<system.web>
<httpModules>
<addname="BasicAuthModule"
type="HttpHandlers.BasicAuth,WebStore"/>
</httpModules>
</system.web>
</configuration>
注重你必要指定完全的范例名和不带dll扩大名的程序集名.
模块同意你检察每一个收到的Web哀求并基于被触发的事务实行一个举措.模块在修正哀求和呼应数据方面做的十分优异,可用为特定的程序供应自界说认证大概为产生在ASP.NET中的每一个哀求增添其他预处置/后处置功效.很多ASP.NET的功效,像认证和会话(Session)引擎都是作为HttpModule来完成的.
固然HttpModule看上往很像ISAPI过滤器,它们都反省每一个经由过程ASP.NET使用的哀求,可是它们只反省映照到单个特定的ASP.NET使用或假造目次的哀求,也就是只能反省映照到ASP.NET的哀求.如许你能够反省一切ASPX页面大概其他任何映照到ASP.NET的扩大名.你不克不及反省尺度的.HTM大概图片文件,除非你显式的映照这些扩大名到ASP.NETISAPIdll上,就像中展现的那样.一个罕见的此类使用多是利用模块来过滤特定目次中的JPG图象内容并在最下层经由过程GDI+来绘制’样品’字样.
完成一个HTTP模块长短常复杂的:你必需完成之包括两个函数(Init()和Dispose())的IHttpModule接口.传出去的事务参数中包括指向HTTPApplication工具的援用,这给了你会见HttpContext工具的才能.在这些办法上你能够挂接到HttpApplication事务上.比方,假如你想挂接AuthenticateRequest事务到一个模块上,你只需像列表5中展现的那样做
列表5:基本的HTTP模块长短常简单完成的
publicclassBasicAuthCustomModule:IHttpModule
{
publicvoidInit(HttpApplicationapplication)
{
//***HookupanyHttpApplicationevents
application.AuthenticateRequest+=newEventHandler(this.OnAuthenticateRequest);
}
publicvoidDispose(){}
publicvoidOnAuthenticateRequest(objectsource,EventArgseventArgs)
{
HttpApplicationapp=(HttpApplication)source;
HttpContextContext=HttpContext.Current;
…dowhatyouhavetodo…}
}
记着你的模块会见了HttpContext工具,从这里能够会见到其他ASP.NET管道中固有的工具,如哀求(Request)和呼应(Response),如许你还能够吸收用户输出的信息等等.可是记着有些器材多是不克不及会见的,它们只要在处置链的后段才干被会见.
你能够在Init()办法中挂接多个事务,如许你能够在一个模块中完成多个分歧的功效.但是,将分歧的逻辑分到独自的类中大概会更分明的将模块举行模块化(译注:这里的模块化和后面的模块没有甚么干系)在良多情形下你完成的功效大概必要你挂接多个事务-比方一个日记过滤器大概在BeginRequest事务中纪录哀求入手下手工夫,然后在EndRequest事务中将哀求停止写进到日记中.
注重一个HttoModule和HttpApplication事务中的重点:Response.End()或HttpApplication.CompleteRequest()会在HttpApplication和Module的事务链中”抄近道”.看”注重Response.End()”来取得更多信息.
注重Response.End()
当创立HttpModule大概在Global.asax中完成事务钩子的时分,当你挪用Response.End或Appplication.CompleteRequest的时分要出格注重.这两个函数都停止以后哀求并中断触发在HTTP管道中后续的事务,然后产生将把持前往到Web服务器中.当你在处置链的前面有诸如纪录日记或对内容举行操纵的举动时,由于他们没有被触发,有大概使你受骗.比方,sample中logging的例子就会失利,由于假如挪用Response.End()的话,EndRequest事务其实不会被触发.效率会有不少的变化。而实际上java是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。 |
|