要通过 HTTP 程序程序执行 URL 重写,我们可以创建一个 HTTP 处理程序工厂,该处理程序工厂的 gethandler() 方法将检查被请求的路径,以确定是否需要重写 URL。如果需要,它可以调用传入的 httpcontext 对象的 rewritepath() 方法,如前面所讨论的。最后,HTTP 处理程序工厂可以返回由 system.web.ui.pageparser 类的 getcompiledpageinstance() 方法返回的 HTTP 处理程序。(此技术与内置 ASP.NET 网页 HTTP 处理程序工厂 pagehandlerfactory 工作时所应用的技术相同。)
由于所有 HTTP 模块都将在实例化自定义 HTTP 处理程序工厂之前进行初始化,因此,在将 URL 重写放在事件的后半段时,使用 HTTP 处理程序工厂就会带来相同的风险,即文件授权无法工作。因此,如果您依赖于 Windows 身份验证和文件授权,您可能希望为 URL 重写使用 HTTP 模块方法。
在下一部分中,我们将对构建可重用的 URL 重写引擎进行讨论。在介绍了 URL 重写引擎(可通过下载本文的代码获得)之后,我们将在剩下的两个部分中对 URL 重写的实际使用情况进行介绍。首先,我们将讨论如何使用 URL 重写引擎,并介绍一个简单的 URL 重写示例。接下来,我们将利用重写引擎的正则表达式功能来提供真正“可删节”的 URL。
返回页首为了有助于描述如何在 ASP.NET Web 应用程序中实现 URL 重写,我创建了 URL 重写引擎。此重写引擎将提供以下功能:
? | 使用 URL 重写引擎的 ASP.NET 页面开发人员可以在 Web.config 文件中指定重写规则。 |
? | 重写规则可以使用正则表达式来实现功能强大的重写规则。 |
? | 可以轻松地将 URL 重写配置为使用 HTTP 模块或 HTTP 处理程序。 |
在本文中,我们将介绍仅使用 HTTP 模块的 URL 重写。要查看如何使用 HTTP 处理程序来执行 URL 重写,请参考可随本文下载的代码。
让我们先介绍一下 Web.config 文件中重写规则的结构。首先,您需要在 Web.config 文件中指明要使用 HTTP 模块还是 HTTP 处理程序来执行 URL 重写。在下载代码中,Web.config 文件包含两个已注释掉的条目:
<!--<httpModules> <add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter" /></httpModules>--><!--<httpHandlers> <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" /></httpHandlers>-->
注释掉 <httpModules> 条目,以使用 HTTP 模块执行重写;注释掉 <httpHandlers> 条目,以使用 HTTP 处理程序执行重写。
除了指定使用 HTTP 模块还是 HTTP 处理程序执行重写外,Web.config 文件还包含重写规则:重写规则由两个字符串组成:要在被请求的 URL 中查找的模式;要替换此模式的字符串(如果找到)。在 Web.config 文件中,此信息是使用以下语法表达的:
<RewriterConfig> <Rules> <RewriterRule> <LookFor>要查找的模式</LookFor> <SendTo>要用来替换模式的字符串</SendTo> </RewriterRule> <RewriterRule> <LookFor>要查找的模式</LookFor> <SendTo>要用来替换模式的字符串</SendTo> </RewriterRule> </Rules></RewriterConfig>
每个重写规则均由 <rewriterrule> 元素表达。要搜索的模式由 <lookfor> 元素指定,而要替换所找到的模式的字符串将在 <sentto> 元素中输入。这些重写规则将从头到尾进行计算。如果发现与某个规则匹配,URL 将被重写,并且对重写规则的搜索将会终止。
在 <lookfor&