在探讨如何实现网址重写这项技术之前,很有必要了解一下iis是处理所接收的web请求的机制。 当一个web请求到达iis web服务器时,iis会根据所请求的文件后缀名来决定如何处理该请求,iis可以处理诸如html页面、图片、静态内容,或者将请求转发给isapi应 用程序,由该isapi应用程序处理后生成html静态内容返回给iis,最后由iis将请求结果发送回给客户端。(一个isapi应用程序就是一套编译 好能随时在后台运行的类库,它的任务就是根据请求生成相关的内容。)
例如:如果iis接收到一个对info.asp教程的请求,它会将该 请求转交给 asp.dll来处理,该isapi应用程序调出并执行所请求的asp页面,然后把生成的html代码返回给iis,iis最后把内容发送回请求客户端。 对于asp.net教程页面,iis则将请求转交给名为 aspnet_isapi.dll的isapi应用程序来处理,该isapi应用程序 调用托管的asp.net工作进程来处理该请求,并将生成的html代码返回给请求客户端。
你可以自定义iis, 将某一类扩展名映射到指定的isapi应用程序,图一显示了iis管理工具中的应用程序配置对话框。
图一.已配置的文件扩展名映射
关于对iis如何管理所接收的请求的详细探讨有些超出本文内容,,重要的是要了解 asp.net引擎只负责处理对扩展名已经被正确配置映射到aspnet_isapi.dll的网络请求。
用isapi过滤器来分析请求
除了将请求的文件扩展名映射到相应的isapi应用程序外,iis 还执行一些其他工作。例如 iis还主动对发出请求的客户端用户进行授权,并判断已授权用户是否对其请求的文件拥有访问权限,在一个请求过程的全部生命期内,iis的处理经历了几个 阶段,在每一个阶段iis都生成一个事件,而该事件可以被isapi过滤器实时操控的。
如同isapi应用程序一样, isapi过滤器也是一块块安装在web服务器上的非托管代码。 isapi应用程序用于对所接收的特定文件类型做出响应,而isapi过滤器含有对iis生成的事件做出响应的代码(contain code),甚至可以编辑进出的数据。isapi也含有众多应用程序,包括:
· 权限控制与授权(authentication and authorization)
· 日志记录与监视(logging and monitoring)
· http内容压缩(http compression)
· 网址重写(url rewriting)
本文所探讨的用asp.net实现的网址重写技术就是 基于isapi过滤器用于网址重写的技术内容,然而我们仍然要讨论一下究竟是使用isapi过滤器还是使用asp.net应用程序提供的技术来实现网址重写技术。
当一个请求传入asp.net引擎的时候会发生什么?
asp.net问世之前,在iis web服务器上的网址重写功能需要通过isapi过滤器来实现,自从这个家伙问世后我们就能通过asp.net来实现url重写了,因为asp.net的 解释引擎与iis有极大的相似之处,产生这些相似性主要是因为 asp.net:
· 在处理接收的请求的生命期内也会产生事件;
· 允许任意数量的httpmodule操控产生的事件,这与iis中的isapi过滤器类似;
· 将请求的资源委托给httphandler处理,这与iis中的isapi应用程序类似。
和iis一样,在一个请求的整个生命期内,asp.net对该请求的处理状态发出的状态改变信号引发相应的事件。例如:beginrequest事件在asp.net开始响应客户端请求之始引发;authenticaterequest事件在asp.net确立用户身份后引发,当然还有诸如authorizerequest,resolverequestcache和endrequest等其它很多事件,这些 都是system.web.httpapplication类下的事件,更多信息请参考技术文档中的类httpapplication概要。
如上所述, 可以创建isapi过滤器并用于相应iis引发的事件,同理,asp.net也提供了httpmodule用于响应asp.net引擎引发的事件,一个asp.net应用程序 通过配置可以拥有多个httpmodule。asp.net引擎 每处理一个请求,便初始化一个相应配置好的httpmodule,并允许它 针对请求处理期间引发的事件生成相应的事件委托。事实上asp.net引擎 处理每一个请求调用大量的事件委托。formsauthenticationmodule就是众多内嵌httpmodule中的一个,它 首先检查是否使用表单授权,如果是的话,它 将检查用户是否已授权,如果没有授权则自动把用户重定向到指定的登录页面。(即:在asp.net中可以直接记录并判别用户登录授权的问题了!)
回忆在iis中,一项请求最后被转交给一个isapi应用程序处理,该应用程序针对每一项请求进行处理并返回相应的数据。例如,客户端发出一个访问经典 asp页面的请求,iis将该请求转交给asp.dll程序处理,asp.dll针对该请求执行asp页面内容,并返回html编码。asp.net也使 用了类似的手法,asp.net引擎在将这些httpmodule初始化后,判断并决定调用相应的httpmodule来处理该请求。(问:怎么程序操作httpmodule)
所有通过asp.net引擎解析的请求最终被送交一个httphandler或者httphandlerfactory(一个httphandler只是简单地返回一个用于处理该请求的httphandler的实例。)最终的委托呈现并响应所请求的html编码,并发送回iis,iis则将html返回给请求客户端。
asp.net包含许多httphandler,例如,pagehandlerfactory是用于呈现asp.net页面内容,webservicehandlerfactory用于呈现asp.net web服务的soap数据包,tracehandler用于将asp.net请求资源的html标记写入trace.axd。
首页 1 2 3 4 5 6 末页