原文:http://space.itpub.net/12639172/viewspace-368974
在 ASP.NET 之前,需要使用 ISAPI 筛选器来实现 IIS Web 服务器上的 URL 重写。由于 ASP.NET 引擎与 IIS 非常相似,因此可以使用 ASP.NET 进行 URL 重写。存在相似之处的原因在于 ASP.NET 引擎可以实现以下功能:
在处理请求时可以引发事件。
允许任意数量的 HTTP 模块处理所引发的事件,这与 IIS 的 ISAPI 筛选器相似。
将呈现被请求资源这项任务委托给 HTTP 处理程序,该处理程序与 IIS 的 ISAPI 扩展相似。
与 IIS 一样,ASP.NET 引擎在请求的有效期内将会触发事件,通过发信号来表示其处理过程从一个状态改变为了另一个状态。例如,当 ASP.NET 引擎首次响应请求时,BeginRequest事件将被触发。接下来触发的是AuthenticateRequest事件,该事件在已建立用户标识时出现。(此外,还有大量的其他事件:AuthorizeRequest、ResolveRequestCache和EndRequest,等等。这些事件属于System.Web.HttpApplication类;有关详细信息,请参阅位于以下网址的技术文档:HttpApplication Class Overview。)
正如上一部分所讨论的,可以创建 ISAPI 筛选器以响应 IIS 引发的事件。同样,ASP.NET 提供了 HTTP 模块,该模块可以响应由 ASP.NET 引擎引发的事件。可以将 ASP.NET Web 应用程序配置为具有多个 HTTP 模块。对于由 ASP.NET 引擎处理的每个请求,将初始化每个已配置的 HTTP 模块,并允许将事件处理程序绑定到处理请求期间所引发的事件。请注意,对每个请求均使用了许多内置 HTTP 模块。其中的一个内置 HTTP 模块是FormsAuthenticationModule,该模块首先检查是否使用了窗体身份验证,如果使用,将检查是否对用户进行了身份验证。如果没有使用,会自动将用户重定向到指定的登录页面。
如上所述,通过使用 IIS,传入请求将最终发送给 ISAPI 扩展,而 ISAPI 扩展的任务是返回特定请求的数据。例如,在请求传统的 ASP 网页时,IIS 将请求传递给 asp.dll ISAPI 扩展,该扩展的任务是返回被请求的 ASP 页面的 HTML 标记。ASP.NET 引擎使用相似的方法。初始化 HTTP 模块后,ASP.NET 引擎的下一项任务是确定应由哪个 HTTP 处理程序来处理请求。
所有通过 ASP.NET 引擎传递的请求最终都将到达 HTTP 处理程序或 HTTP 处理程序工厂(HTTP 处理程序工厂仅返回 HTTP 处理程序的实例,然后使用该实例来处理请求)。最终的 HTTP 处理程序将返回响应,即呈现被请求的资源。此响应将被发送回 IIS,然后 IIS 将响应返回给提出请求的用户。
ASP.NET 包括许多内置的 HTTP 处理程序。例如,PageHandlerFactory用于呈现 ASP.NET 网页。WebServiceHandlerFactory用于呈现 ASP.NET Web 服务的响应 SOAP 信封。TraceHandler将向trace.axd呈现请求的 HTML 标记。
图 2 描述了如何处理对 ASP.NET 资源的请求。首先,IIS 接收到请求,并将请求调度给 aspnet_isapi.dll。接下来,ASP.NET 引擎对已配置的 HTTP 模块进行初始化。最后将调用正确的 HTTP 处理程序,并呈现被请求的资源,将所生成的标记返回给 IIS 和请求客户端。
在 ASP.NET 之前,需要使用 ISAPI 筛选器来实现 IIS Web 服务器上的 URL 重写。由于 ASP.NET 引擎与 IIS 非常相似,因此可以使用 ASP.NET 进行 URL 重写。存在相似之处的原因在于 ASP.NET 引擎可以实现以下功能:
在处理请求时可以引发事件。
允许任意数量的 HTTP 模块处理所引发的事件,这与 IIS 的 ISAPI 筛选器相似。
将呈现被请求资源这项任务委托给 HTTP 处理程序,该处理程序与 IIS 的 ISAPI 扩展相似。
与 IIS 一样,ASP.NET 引擎在请求的有效期内将会触发事件,通过发信号来表示其处理过程从一个状态改变为了另一个状态。例如,当 ASP.NET 引擎首次响应请求时,BeginRequest事件将被触发。接下来触发的是AuthenticateRequest事件,该事件在已建立用户标识时出现。(此外,还有大量的其他事件:AuthorizeRequest、ResolveRequestCache和EndRequest,等等。这些事件属于System.Web.HttpApplication类;有关详细信息,请参阅位于以下网址的技术文档:HttpApplication Class Overview。)
正如上一部分所讨论的,可以创建 ISAPI 筛选器以响应 IIS 引发的事件。同样,ASP.NET 提供了 HTTP 模块,该模块可以响应由 ASP.NET 引擎引发的事件。可以将 ASP.NET Web 应用程序配置为具有多个 HTTP 模块。对于由 ASP.NET 引擎处理的每个请求,将初始化每个已配置的 HTTP 模块,并允许将事件处理程序绑定到处理请求期间所引发的事件。请注意,对每个请求均使用了许多内置 HTTP 模块。其中的一个内置 HTTP 模块是FormsAuthenticationModule,该模块首先检查是否使用了窗体身份验证,如果使用,将检查是否对用户进行了身份验证。如果没有使用,会自动将用户重定向到指定的登录页面。
如上所述,通过使用 IIS,传入请求将最终发送给 ISAPI 扩展,而 ISAPI 扩展的任务是返回特定请求的数据。例如,在请求传统的 ASP 网页时,IIS 将请求传递给 asp.dll ISAPI 扩展,该扩展的任务是返回被请求的 ASP 页面的 HTML 标记。ASP.NET 引擎使用相似的方法。初始化 HTTP 模块后,ASP.NET 引擎的下一项任务是确定应由哪个 HTTP 处理程序来处理请求。
所有通过 ASP.NET 引擎传递的请求最终都将到达 HTTP 处理程序或 HTTP 处理程序工厂(HTTP 处理程序工厂仅返回 HTTP 处理程序的实例,然后使用该实例来处理请求)。最终的 HTTP 处理程序将返回响应,即呈现被请求的资源。此响应将被发送回 IIS,然后 IIS 将响应返回给提出请求的用户。
ASP.NET 包括许多内置的 HTTP 处理程序。例如,PageHandlerFactory用于呈现 ASP.NET 网页。WebServiceHandlerFactory用于呈现 ASP.NET Web 服务的响应 SOAP 信封。TraceHandler将向trace.axd呈现请求的 HTML 标记。
图 2 描述了如何处理对 ASP.NET 资源的请求。首先,IIS 接收到请求,并将请求调度给 aspnet_isapi.dll。接下来,ASP.NET 引擎对已配置的 HTTP 模块进行初始化。最后将调用正确的 HTTP 处理程序,并呈现被请求的资源,将所生成的标记返回给 IIS 和请求客户端。