科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件在ASP.NET中实现Url Rewriting(二)

在ASP.NET中实现Url Rewriting(二)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

用ISAPI过滤器来分析请求   除了将请求的文件扩展名映射到相应的ISAPI应用程序外,IIS还执行一些其他工作。

作者:中国IT实验室 来源:中国IT实验室 2007年8月31日

关键字: Rewriting URL ASP.NET

  • 评论
  • 分享微博
  • 分享邮件
用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确立用户身份后引发,当然还有诸如AuthorizeRequestResolveRequestCacheEndRequest等其它很多事件,这些 都是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。

  图二描绘了一个针对ASP.NET资源的请求所经过的处理流程。首先,IIS接收到该请求并将其转交给aspnet_isapi.dll。其次,ASP.NET引擎将一些HttpModule初始化。最后,最终的HttpHandler被调用,生成相应的标记语言,并将其返回给IIS,最终返回到请求客户端。

按此在新窗口浏览图片
图二.IIS和ASP.NET对请求的处理过程

  创建并注册自定义HttpModule和HttpHandler

  创建自定义HttpModule的工作相对较简单,它包括一个实现当前接口的托管类,HttpModule必须实现System.Web.IHttpModule接口,同样HttpHandlerHttpHandlerFactory必须分别实现System.Web.IHttpHandler接口和System.Web.IhttpHandlerFactory接口。有关创建HttpHandlerHttpModule的细节已经超出本书范围。

  一旦HttpModuleHttpHandler被创建后,必须向Web应用程序注册。如果要 向整个Web服务器HttpModuleHttpHandler只需简单的写入machine.config文件;如果是 由指定的Web应用程序调用则需在该程序的web.config配置文件中添加几行XML标记。

  例如,要向指定的Web应用程序注册HttpModuleHttpHandler,只需向该Web应程序的web.config配置文件中configuration\System.Web节中添加下列几行:



<HttpModules>
<add type="type" name="name" />
</HttpModules>

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章