asp.net 中的 URL重写

来源:互联网 发布:手机淘宝客户端 html5 编辑:程序博客网 时间:2024/05/01 04:29

URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。
   比如浏览器发来请求hostname/101.aspx ,服务器自动将这个请求中定向为http://hostname/list.aspx?id=101。

url重写的优点在于:
     缩短url,隐藏实际路径提高安全性
     易于用户记忆和键入。
     易于被搜索引擎收录

二 实现url重写的基本方法
    下载MS的URLRewriter.dll,放到你的web程序的bin下
下载地址1:http://www.rickel.cn/uploads/DevTools/MSDNURLRewriting.msi
下载地址2:download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi

下载完成后,在web.config里设置如下:


<?xml version="1.0" encoding="utf-8" ?>
<!--overred-->
<configuration>
     <configSections>
         <section name="RewriterConfig"type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
     </configSections>
     <RewriterConfig>
         <Rules>
             <RewriterRule>
                 <LookFor>~/d(/d+)/.aspx</LookFor>
                 <SendTo>~/default.aspx?id=$1</SendTo>
             </RewriterRule>
         </Rules>
     </RewriterConfig>
     <system.web>
         <httpHandlers>
             <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
         </httpHandlers>
    </system.web>
</configuration>


其中
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />

用于指定配置节"RewriterConfig"的处理程序类的名称为”URLRewriter.Config.RewriterConfigSerializerSectionHandler”,该类存在于bin目录下的URLRewriter .dll文件中

关键的是这两句
<LookFor>~/d(/d+)/.aspx</LookFor>
<SendTo>~/default.aspx?id=$1</SendTo>

< LookFor>~/d(/d+)/.aspx</LookFor>表示,用户输入的url,d(/d+)/.aspx是 url中文件名匹配的正则表达式(此处为字母d开头,后面跟一个或多个数字,并以.aspx结尾。用户也可根据自己的需要自行设定)。
<SendTo> ~/default.aspx?id=$1</SendTo>,表示当服务器接收到符合上面条件的请求后如何重写url。此处表示访问 defalutl.aspx并传入参数id,其值$1将用用户请求的文件名中的第一个数字来表示。
例如用户输入  hostname/d11.aspx,服务器会把他重写为http://hostname/default.aspx?id=11。换句话说用户输入 http: //hostname/d11.aspx,实际访问的是http://hostname/default.aspx?id=11。这样就起到了隐藏真实文件名,并便于用户记忆的作用。

处理回发
在重写后的url里如果产生回发,例如有一个按钮,又调用了该被重写的 aspx,用户浏览器中将会显示该aspx文件实际的地址,也就是http: //hostname/default.aspx?id=11。但从用户的角度考虑,如 果单击按钮时突然看到 URL 更改会使他们感到不安。因此必须解决这个问题。
解决方法有二:
(1)自己定义一个Actionlessform类,在aspx中不再使用系统提供的form 标记

namespace ActionlessForm
{
     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);
          }
     }
}

创建此类并对其进行编译之后,要在 ASP.NET Web 应用程序中使用它,应首先将其添加到 Web 应用程序的 References 文件夹中。然后,要使用它来代替 HtmlForm 类,做法是在 ASP.NET 网页的顶部添加以下内容:

<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm" %>
然后,将 <form runat="server">(如果有)替换为:<skm:Form id="Form1" method="post" runat="server">
并将右边的 </form> 标记替换为:</skm:Form>

个人并不推荐该方法
(2)第二种方法就是继承page,这样你不需要在aspx页中改任何东西。
代码:
using System;
using System.IO;
using System.Web;
using System.Web.UI;
namespace URL
{
     public class OLPage : Page
     {
         public OLPage()
         {}
         protected override void Render(HtmlTextWriter writer)
         {
             if (writer is System.Web.UI.Html32TextWriter)
             {
                 writer = new FormFixerHtml32TextWriter(writer.InnerWriter);
             }
             else
             {
                 writer = new FormFixerHtmlTextWriter(writer.InnerWriter);
             }
             base.Render(writer);
         }
     }

     internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
     {
         private string _url; // 假的URL

     internal FormFixerHtml32TextWriter(TextWriter writer):base(writer)
     {
         _url = HttpContext.Current.Request.RawUrl;
     }

     public override void WriteAttribute(string name, string value, bool encode)
     {
         if (_url != null && string.Compare(name, "action", true) == 0)
         {
             value = _url;
         }
         base.WriteAttribute(name, value, encode);

         }
     }

internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
{
     private string _url;
     internal FormFixerHtmlTextWriter(TextWriter writer):base(writer)
     {
         _url = HttpContext.Current.Request.RawUrl;
     }
   
     public override void WriteAttribute(string name, string value, bool encode)
     {
         if (_url != null && string.Compare(name, "action", true) == 0)
         {
             value = _url;
         }
         base.WriteAttribute(name, value, encode);
     }
}

}

把这个文件编译成dll,并在你的项目中引用它。


然后把项目中的所有aspx文件对应的cs文件中的继承page类的代码改写为继承OLPage。
例如
public class WebForm1:page
改写为
public class WebForm1:URL.OLPage

这样就解决回发问题。
编译*.dll方法:/t:library name.cs

 

 

转自http://www.csharp360.com/bbs/viewthread.php?tid=186&extra=

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝买东西换货卖家不发货怎么办 淘宝自动默认付款没发货怎么办 支付宝支付失败可钱扣了怎么办 苹果nfc感应坏了怎么办 老鼠添过的盘子怎么办 ie浏览器页面显示网页错误怎么办 Ⅵvo手机声音小怎么办 小米手机预约错了怎么办 小米note二手没解锁怎么办 艾灸后脸色越黑怎么办 淘宝软件类目不能上架宝贝怎么办 ae中没有mpg格式怎么办 淘宝小二处理不公怎么办 遇到卖保险的人怎么办 租房合同没理家电清单怎么办 普雪油烟机坏了怎么办 我累了 真的累了怎么办 u盘15g变成4g了怎么办 属兔的买了东户怎么办 玩时时彩输了2万怎么办 胸变的又软又小怎么办 u盘16g变成4g了怎么办 1岁宝宝吃了就吐怎么办 脚崴了肿了很痛怎么办 九格拼图5在9那怎么办 4s锁屏密码忘了怎么办 6p触屏偶尔乱跳怎么办 新办劳务公司的劳务资质怎么办 汽车没电了打不着火怎么办 吃凉的甜的牙疼怎么办 学车对点对不上怎么办 发现老公有外遇最明智的怎么办 想开个童装店但是没经验怎么办 母乳不够吃宝宝又不喝奶粉怎么办 掉头发很厉害怎么办有什么偏方 红米2a刷死机了怎么办 公司退市我们买的股票怎么办 黑魂3把npc杀了怎么办 摔倒了膝盖摔肿了又痛怎么办 厕所堵了怎么办疏通马桶有妙招 月经不来怎么办如何让它快点来