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

     原理的东西都被巨人将了,我站在巨人的肩膀上记录着成长的点滴,见.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&amp;month=$2&amp;day=$3&amp;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全部重写下来的时候,那种心情没人知道的。

还是打个包上来吧,还可以把路径中的文件名隐藏的,就是得配一个虚拟路径,牺牲很大,没那样实现了。https://files.cnblogs.com/medal/HttpHander.rar

原文地址:https://www.cnblogs.com/medal/p/1268869.html