一个完整的ASP.NET 2.0 URL重写方案[翻译]

时间:2021-05-25

这篇文章描述了一个完整的 ASP.NET 2.0 URL 重写方案。这个方案使用正则表达式来定义重写规则并解决通过虚拟 URLs访问页面产生回发事件的一些可能的困难。

为什么要重写 URL ?

将 URL 重写方法应用到你的 ASP.Net 应用程序的两个主要原因是:可用性和可维护性。

可用性

谁都知道,相对于难于辨认的带参数的长的查询路径,用户更喜欢一些短的、简洁的 URL。任何时候,一个容易记住和敲入的路径比添加到收藏夹更有用。其次,当一个浏览器的收藏夹不可用时,记住的地址总比在搜索引擎中输入关键字进行搜索,然后再查找要强的多。比较下面的两个地址:

(1)

http:///Blog.aspx. 这个并不是我们需要的。所以,需要加一段代码来处理这些不希望的结果。

首先,我们要在HttpModule 注册和实现一个另外的方法:

public void Init(HttpApplication context)

{

// it is necessary to

context.BeginRequest += new EventHandler(
RewriteModule_BeginRequest);

context.PreRequestHandlerExecute += new EventHandler(
RewriteModule_PreRequestHandlerExecute);

}

void RewriteModule_PreRequestHandlerExecute(object sender, EventArgs e)

{

HttpApplication app = (HttpApplication)sender;

if ((app.Context.CurrentHandler is Page) &&
app.Context.CurrentHandler != null)

{

Page pg = (Page)app.Context.CurrentHandler;

pg.PreInit += new EventHandler(Page_PreInit);

}

}

这个方法检查用户是否请求了一个正常的ASP.NET页,然后为该页的PreInit 事件增加处理过程。这儿 RewriteContext 将处理实际参数,然后二次重写URL。二次重写是必需的,以使 ASP.NET 能够在它的表单的action属性中使用一个虚拟路径。

void Page_PreInit(object sender, EventArgs e)

{

// restore internal path to original

// this is required to handle postbacks

if (HttpContext.Current.Items.Contains("OriginalUrl"))

{

string path = (string)HttpContext.Current.Items["OriginalUrl"];

// save query string parameters to context

RewriteContext con = new RewriteContext(
HttpContext.Current.Request.QueryString, path);

HttpContext.Current.Items["RewriteContextInfo"] = con;

if (path.IndexOf("?") == -1)

path += "?";

HttpContext.Current.RewritePath(path);

}

}

最后,我们来看一下在我们的重写模块程序集中的三个类:

在web.config 中注册重写模块

要使用重写模块,需要在配置文件中的 httpModules 节注册重写模块,如下:

<httpModules>

<add name="RewriteModule" type="RewriteModule.RewriteModule, RewriteModule"/>

</httpModules>

使用重写模块

在使用重写模块时,需要注意:

  • 在web.config 中来使用一些特殊字符是不可能的,因为它是一个结构良好的 XML 文件,因此,你只能用 HTML 编码的字符代替,如:使用 &amp;代替 &。
  • 要在你的 ASPX 中使用相对路径,需要在HTML标签调用 ResolveUrl 方法,如: <img src="<%=ResolveUrl("~/Images/Test.jpg")%>" />。
  • Bear in mind the greediness of regular expressions and put rewriting rules to web.config in order of their greediness, for instance:
<rule source="Directory/(.*)/(.*)/(.*)/(.*).aspx"
destination="Directory/Item.aspx?
Source=$1&amp;Year=$2&amp;ValidTill=$3&amp;Sales=$4"/>
<rule source="Directory/(.*)/(.*)/(.*).aspx"
destination="Directory/Items.aspx?
Source=$1&amp;Year=$2&amp;ValidTill=$3"/>
<rule source="Directory/(.*)/(.*).aspx"
destination="Directory/SourceYear.aspx?
Source=$1&amp;Year=$2&amp;"/>
<rule source="Directory/(.*).aspx"
destination="Directory/Source.aspx?Source=$1"/>
  • 如果你要在页面中使用RewriteModule 而不使用 .aspx,就必须在 IIS 中进行配置以使用期望的扩展映射到请求页,如下节所述:

IIS 配置:使用带扩展的重写模块代替 .aspx

要使用带扩展的重写模块代替.aspx (如 .html or .xml),必须配置 IIS ,以使这些扩展映射到 ASP.NET引擎 (ASP.NET ISAPI 扩展)。要进行这些设置,需要以管理员身份登录。

打开IIS管理控制台,并选择你要配置的站点的虚拟路径:

Windows XP (IIS 5)
Virtual Directory "RW"

Windows 2003 Server (IIS 6)
Default Web Site

然后在虚拟路径标签上点击Configuration…按钮 (或如果要使用整个站点都做映射就选择主目录标签)。

Windows XP (IIS 5)

Windows 2003 Server (IIS 6)

接下来,点击添加按钮,并输入一个扩展,你还需要指定一个 ASP.NET ISAPI扩展,注意去掉选项的对勾以检查文件是否存在。

如果你要把所有的扩展都映射到ASP.NET,对Windows XP上的IIS 5来说只需要设置 .*到 ASP.NET ISAPI,但对 IIS 6就不一样了,点击“添加”然后指定 ASP.NET ISAPI 扩展。

总结

现在,我们已经创建了一个简单的但非常强大的 ASP.NET 重写模块,它支持可基于正则表达式的 URLs和页面回发,这个解决方案是容易实现的,并且提供给用户的例子也是可用的,它可以用简短的、整洁的URL来替代查询字符串参数。 要使用这个模块,只需简单在你的应用程序中对 RewriteModule进行引用,然后在 web.config文件中添加几行代码以使你不想显示的 URL通过正则表达式代替。这个重写模块是很容易部署的,因为只需要在web.config中修改任何“虚拟”的URL即可,如果你需要进行测试,还可以对重写模块进行关闭。

要想对重写模块有一个深入的了解,你可以查看本文提供的原代码。我相信你会发现这是一个比ASP.NET提供的原始映射更好的体验。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章