在 ASP.NET 中执行 URL 重写(2)
请求到达 iis 时将会发生什么情况
在正式研究 url 如何实现重写之前,应首先了解 microsoft® internet information services (iis) 如何处理传入请求,这一点非常重要。当请求到达 iis web 服务器时,iis 检查被请求文件的扩展名以确定如何处理该请求。iis 可以自行处理请求(如 html 页面、图像以及其他静态内容),或者将请求路由到 isapi 扩展。(isapi 扩展是一个处理传入 web 请求的非托管编译类。其任务是生成被请求资源的内容。)
例如,当传入针对 info.asp 网页的请求时,iis 会将此消息路由到 asp.dll isapi 扩展。然后,该 isapi 扩展将加载被请求的 asp 页面,执行该页面,并将所呈现的 html 返回给 iis,然后,iis 将该 html 发送回请求客户端。对于 asp.net 页面,iis 会将此消息路由到 aspnet_isapi.dll isapi 扩展。然后,aspnet_isapi.dll isapi 扩展将处理操作传递给托管的 asp.net 辅助进程,该辅助程序将处理请求,并返回 asp.net 网页的呈现 html。
您可以自定义 iis,以指定扩展名与 isapi 扩展的映射关系。图 1 显示了 internet information services 管理工具的“应用程序配置”对话框。请注意,与 asp.net 有关的扩展名(.aspx、ascx、config、asmx、rem、cs、vb 及其他)均已映射到 aspnet_isapi.dll isapi 扩展。
讨论 iis 如何管理传入请求稍稍超出了本文范围。但是可以在 michele leroux bustamante 的文章 inside iis and asp.net 中找到对此内容的深入讨论。asp.net 引擎仅处理那些扩展名已明确映射至 iis 中的 aspnet_isapi.dll 的传入 web 请求,了解这一点非常重要。
<b>使用 isapi 筛选器检查请求</b>
iis 除了可以将传入 web 请求的文件扩展名映射到相应的 isapi 扩展之外,还将执行许多其他任务。例如,iis 将尝试对发出请求的用户进行身份验证,并确定通过身份验证的用户是否有权限访问被请求的文件。在处理请求的有效期内,iis 将经历几个状态。在每个状态下,iis 都将引发可以使用 isapi 筛选器以编程方式进行处理的事件。
与 isapi 扩展一样,isapi 筛选器是在 web 服务器上安装的非托管代码块。isapi 扩展被设计为可以响应针对特定文件类型的请求。另一方面,isapi 筛选器还包含可以对 iis 引发的事件进行响应的代码。isapi 筛选器可以截取甚至修改传入和传出的数据。isapi 筛选器可以应用于很多方面,包括:
• 身份验证和授权。
• 记录和监视。
• http 压缩。
• url 重写。
虽然 isapi 筛选器可用于执行 url 重写,但本文将讨论如何使用 asp.net 实现 url 重写。不过,我们将对使用 isapi 筛选器与使用 asp.net 中的技术实现 url 重写进行权衡。
请求进入 asp.net 引擎时将会发生什么情况
在 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 处理[来源 www.iocblog.net]
Tag: URL重写
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。