在ASP。NET 2。0 中的URL映射(URL Mapping)
在理想的情况下,我们第一次设计完美的设计好程序了。页面将会在适当的文件夹里被创建并且呆在那里。用户将不会去在意我们程序中的页面的URL。所以我们可以把页面放在任何想放的地方,而不用去担心页面的URL问题。
在实际情况中,事情没有这么简单。你也许会在你发布程序之后,发现你要去认真的决定你的文档架构。作为解决办法之一,用户可能会愿意看到这样的URL,
http://www.example.com/widget.aspx
而不是
http://www.example.com/Products/W/widget.aspx
当你发布程序之后做这样的改变,可能是最单调无味的,花费时间去重写代码。
幸运的是,ASP.NET 2.0 推荐了一种新的工具去解:URL mapping。在这里,我将展示如何在一个Asp.net站点使用URL mapping。我还将展示这种技术的局限性与这些局限性的解决办法。
URL Mapping in Action
动态中的URL 映射(Mapping)
让我们用Widgets页面作为例子。
图1展示了一个非常简单的ASP.NET 2.0 应用程序
默认的,Widget.aspx页面将可以用~/Products/W/Widget.aspx(在这里的第一个字符~代表了网站根目录的路径)问的。在ASPNET 2.0中的新特性就是你可以通过程序中的 web.config 文件来改变你的路径。为了做到这个程序,你需要在<system.web>中添加一个<urlMappings> 部分。这里有你做MAPPING过程中想要的代码。
<system.web>
<urlMappings enabled="true">
<add url="~/Widget/aspx" mappedUrl="~/Products/W/Widgets.aspx"/>
</arlMappings>
</system.web>
<system.web>
<urlMappings enabled="true">
<add url="~/Widget/aspx" mappedUrl="~/Products/W/Widgets.aspx"/>
</arlMappings>
</system.web>
在<urlMappings>部分,你可以有很多的<add>部分,每个这样的部分都有一个URL属性,这个属性指定了用户将要输入的URL,还有一个mappedUrl的属性,这个属性指定了实际的URL。这个实际的URL是代替用户输入URL的,是应用程序要传递的,
图2展示了在这样的情况下用户输入指定的URL的结果。
注意通过asp.net 的事件已经传递了映射的URL,那个用户输入的URL仍然显示在浏览器的地址栏上。
The Limits of URL Mapping
URL映射的局限性
URL映射的主要局限,就像运行在ASP.NET 2.0 中一样,是一个纯粹的静态技术,不带任何的通配符。你可以包含一个查询在URL中(例如,有可能映射~/Products/Widget.aspx 到 ~/Products.aspx?ProductID=widget)。可是你不能设置一个映射,然后用正则表示式去改变相所有的相似URLs 到相似的映射的URLs。对于许多应用程序来说,这是很严格的,绝大多数的决定性的局限相当地削弱了URL映射的效用。
为什么会有这样的局限? 微软的Scott Guthrie在他的博客中解释,公司计划在IIS 7.0中提供全面的URL重写的特性。IIS 7.0 将预定做为Longhorn Server (操作系统)的一部分装载。随着未来几年内的Longhorn Server的完成,微软不会为了这个系统的发布,而让ASP.NET 2.0 的队伍去解决可测量性跟安全性方面的问题。
灵活的URL 重写
幸运的是,你不用因为得到更多的灵活的URL重写而去等Longhorn Server的发布。今天,这里有几种的解决方安可以帮助你如果你需用正则表达式去做ASP.NET 2.0 URL重写。
为了那些初学者,很多ASP.NET的开发人员已经完成了他们自己的,针对带着RegEx 支持的URL 重写的HTTP模块。我已经看了其中的一个,它对于的ASP.NET 2.0的其它特性(像 THEMES)的大部分支持可以在Albert Weinert and Thomas Bandt的UrlRewritingNet namespace中找到。这个开源的部件仍然要在web.config文件的规则去配置,但现在,这个规则可以使用正则表达式去匹配或者替代。例如,这儿有几个有正在使用这个构件的有效规则
<rewrites>
<add virtualUrl="^~/(.*)/(.*).aspx"
rewriteUrlParameter="StoreInContextItems"
destinationUrl="~/$2.aspx?language=$1¶meter=$2"
ignoreCase="true" />
</rewrites>
这个规则将映射一个URL ~/English/Add.aspx到一个~/Add.aspx?language=English&meter=add
要拥有更多的灵活性,你可以去看看商业ISAPI_rewrite URL 处理机制。 带HTTP模式的解决方安的问题之一就是只对ASPX文件有效(或者其他的一些可以传递给ASP.NET机制的文件)。因为它是作为一个ISAPI的过滤器。 ISAPI_rewrite可以任何发给IIS的URL。这个可以允许你去应用基于正则表达式的重写技术到任何的文件类型,例如,如果你需要带着查询参数重定位图像文件或者映射 .html URL 到 .aspx页面,这个工具可以做这样的工作。ISAPI_rewrite 有测试版跟商业版($69),可以解决大多熟运行在单个服务器上的网站所遇到的问题。
一个值得知道的技术
URL rewriting 是一个很有用的工具,你最好把它想成一个可以使你网站从给网站用户的逻辑表达到你网站的物理布局简单化。有了WURL rewriting技术,你可以像你的用户提交一个友好的,简短的URLs到浏览器。 可以在你的源代码树中仍然使用很长,详细的,有组织的URLS。
你可以用Microsoft的原来自带的ASP.NET 2.0 的URL解决方法,或者你需要更灵活的,已经在本文中指出的,经过评估的那些软件,这取决于你对URL rewriting的需要的复杂度。你将觉得这些软件对你很有帮助。