您的位置:首页 > 理论基础 > 计算机网络

httpHandler和url映射打造自己的后缀网站

2008-08-15 17:18 369 查看
原理的东西都被巨人将了,我站在巨人的肩膀上记录着成长的点滴,见.html、.aspx、.asp、.jsp等等后缀的网页不觉得新鲜,可上校内就觉得.do网页后缀值得思考,.do难道是校内自己的开发平台,不可能吧,校内有这么强悍。突然某一天让我看到了msdn的这边文章:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx?mfr=true,一切才变得豁然开朗。一个URLRewrite.dll就把所有的问题解决。下面主要从三个地方来谈谈实现细节。

1、httpHander添加自己的后缀。

所有配置的前提都是添加了URLRewrite.dll引用的情况为依据的,这里我添加.html和.do的后缀,首先在配置文件<httpHandlers>中添加<add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />

<add verb="*" path="*.html" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />

<add verb="*" path="*.do" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />,然后打开iis,定位到虚拟目录,配置,映射,添加,在扩展名中添加上.do,可执行文件就跟.aspx的可执行文件目录一样,可以从哪里复制过来。然后把下面的确认文件是否存在的勾去掉。现在.do或者.html就是能被阅览器解释执行的网页后缀了。

2、通过映射来实现假路径替换真路径

现在我们应该可以输入http://localhost/default.do可以访问default.aspx页面,这就是映射。首先在<configSections>下添加自定义节点<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />,在从与<web.config>平行的地方添加映射规则:

<RewriterConfig>

<Rules>

<RewriterRule>

<LookFor>~/("w{4})/("w{2})/("w{2})/("w{2})/index".html</LookFor>

<SendTo>~/MoreLevelUrlWrite.aspx?year=$1&month=$2&day=$3&id=$4</SendTo>

</RewriterRule>

<RewriterRule>

<LookFor>~/("d{4})".aspx</LookFor>

<SendTo>~/OneLevel.aspx?year=$1</SendTo>

</RewriterRule>

<RewriterRule>

<LookFor>~/("d{4})/("d{2})/Default".aspx</LookFor>

<SendTo><![CDATA[~/MoreLevelUrlWrite.aspx?year=$1&month=$2]]></SendTo>

</RewriterRule>

<RewriterRule>

<LookFor>~/default.do</LookFor>

<SendTo>~/default.aspx</SendTo>

</RewriterRule>

</Rules>

</RewriterConfig>

这段配置节是从我的config中copy下来的,最后一个配置节就是实现default.do到default.aspx的映射。

3、处理回送情况

我们输入http://localhost/default.do实际是访问的是default.aspx那么如果default.aspx有postback情况,那肯定有postback到default.aspx路径了,这很不利于用户体验,解决这问题得重写web窗体,新建一个项目:ActionlessForm,建一个类Form继承htmlForm,重写RenderAttributes方法。具体代码如下: public class Form : System.Web.UI.HtmlControls.HtmlForm

{

protected override void RenderAttributes(HtmlTextWriter writer)

{

writer.WriteAttribute("name", this.Name);

base.Attributes.Remove("name");

writer.WriteAttribute("method", this.Method);

base.Attributes.Remove("method");

this.Attributes.Render(writer);

base.Attributes.Remove("action");

if (base.ID != null)

writer.WriteAttribute("id", base.ClientID);

}

}

然后default.aspx所在项目添加刚建项目的引用,把default.aspx的窗体替换下来,在default.aspx中页头:<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>

在把<form ranat=server></form>改成<skm:Form id="form" runat="server"></skm:Form>,其他地方不用修改。

当我花一天时间把这些内容搞清楚,并用了一定的映射机制把我们公司网站url全部重写下来的时候,那种心情没人知道的。

还是打个包上来吧,还可以把路径中的文件名隐藏的,就是得配一个虚拟路径,牺牲很大,没那样实现了。http://files.cnblogs.com/medal/HttpHander.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: