ASP.NET 中执行 URL 重写

作者:overred   来源:原创
URL 重写就是把URL地址重新改写(汗^_^)。
详情:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx
优点:把url缩短等
用法:1.下载ms的URLRewrite.dll,放到你的bin下
2.在web.config里设置如下:
None.gif<?xml version="1.0" encoding="utf-8" ?>
None.gif
<configuration>
None.gif
<configSections>
None.gif    
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
None.gif
</configSections>
None.gif
<RewriterConfig>
None.gif
<Rules>
None.gif
<RewriterRule>
None.gif
<LookFor>~/d(\d+)\.aspx</LookFor>
None.gif
<SendTo>~/default.aspx?id=$1</SendTo>
None.gif
</RewriterRule>
None.gif
</Rules>
None.gif
</RewriterConfig>
None.gif
<system.web>
None.gif
<httpHandlers>
None.gif
<add verb="*" path="*.aspx" 
None.giftype
="URLRewriter.RewriterFactoryHandler, URLRewriter" />
None.gif
</httpHandlers>
None.gif

然后在cs里写:

None.gifprivate void Page_Load(object sender, System.EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
// 在此处放置用户代码以初始化页面
InBlock.gif
    Response.Write(Request.QueryString["id"]+"<BR>");
InBlock.gif    Response.Write(
"haha");
ExpandedBlockEnd.gif}


只要输入

localhost/overred/d123.aspx(注意:开头必须为d,后为数字)
其实这个d123.aspx是虚拟的,并不是实际存在的。只要符合格式就行。

他就会跳到http://localhost/overred/default.aspx

而且他在default里可以捕捉一些参数比如id,就是你的d后的数字(后必须为数字),这样你就可以显示id为123的文章。

在重写后的url里如果产生回发将会传递到d123.aspx,这样用户在点button时会看到哪个实际的地址,msdn上说的:但从用户的角度考虑,如果单击按钮时突然看到 URL 更改会使他们感到不安。

可见ms把客户捧为他的上帝!(真的?#¥%……—*)

继续引用ms:

出现这种情况的原因是:在呈现 Web 窗体时,它会将其操作属性直接设置为 Request 对象中文件路径的值。当然,在呈现 Web 窗体时,URL 已从 /Products/Beverages.aspx 重写为 ListProductsByCategory.aspx?CategoryID=1,这表明 Request 对象报告用户要访问 ListProductsByCategory.aspx?CategoryID=1。只需使服务器端窗体不呈现操作属性即可解决此问题。(默认情况下,如果窗体不包含操作属性,浏览器将会回发。)

不幸的是,Web 窗体不允许您明确指定操作属性,也不允许您设置某些属性以禁用操作属性的呈现。因此,我们必须自己来扩展 System.Web.HtmlControls.HtmlForm 类,覆盖 RenderAttribute() 方法并明确指出它不会呈现操作属性。

由于继承功能,我们可以获得 HtmlForm 类的所有功能,并且只需添加几行代码即可获得所需的行为。以下显示了自定义类的完整代码:

None.gifnamespace ActionlessForm
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public class Form : System.Web.UI.HtmlControls.HtmlForm
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
protected override void RenderAttributes(HtmlTextWriter writer)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            writer.WriteAttribute(
"name"this.Name);
InBlock.gif            
base.Attributes.Remove("name");
InBlock.gif
InBlock.gif            writer.WriteAttribute(
"method"this.Method);
InBlock.gif            
base.Attributes.Remove("method");
InBlock.gif
InBlock.gif            
this.Attributes.Render(writer);
InBlock.gif
InBlock.gif            
base.Attributes.Remove("action");
InBlock.gif
InBlock.gif            
if (base.ID != null)
InBlock.gif            writer.WriteAttribute(
"id"base.ClientID);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

已被覆盖的 RenderAttributes() 方法的代码仅包含 HtmlForm 类的 RenderAttributes() 方法的准确代码,而不设置操作属性。(我使用 Lutz Roeder 的 Reflector 来查看 HtmlForm 类的源代码。)

创建此类并对其进行编译之后,要在 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>

以上的是继承个form,其实还有更简单的,就是继承page,这样你不需要在aspx页中改任何东西。
代码:

None.gifusing System;
None.gif
using System.IO;
None.gif
using System.Web;
None.gif
using System.Web.UI;
None.gif
None.gif
namespace URl
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//**//**//// <summary>
InBlock.gif    
/// 页面基类
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public class OLPage : Page
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public OLPage()
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
ExpandedBlockStart.gifContractedBlock.gif    
/**//**//**//// <summary>
InBlock.gif    
/// 重写默认的HtmlTextWriter方法,修改form标记中的value属性,使其值为重写的URL而不是真实URL。
InBlock.gif    
/// </summary>
ExpandedBlockEnd.gif    
/// <param name="writer"></param>

None.gif    protected override void Render(HtmlTextWriter writer)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
InBlock.gif
InBlock.gif        
if (writer is System.Web.UI.Html32TextWriter)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            writer 
= new FormFixerHtml32TextWriter(writer.InnerWriter);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
else
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            writer 
= new FormFixerHtmlTextWriter(writer.InnerWriter);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
base.Render(writer);
ExpandedBlockEnd.gif    }

None.gif
None.gif}
None.gif
None.gif
None.gif
None.gif
None.gif    
internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
InBlock.gif        
private string _url; // 假的URL
InBlock.gif

InBlock.gif        
internal FormFixerHtml32TextWriter(TextWriter writer):base(writer)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif        _url 
= HttpContext.Current.Request.RawUrl;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public override void WriteAttribute(string name, string value, bool encode)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif        
// 如果当前输出的属性为form标记的action属性,则将其值替换为重写后的虚假URL
InBlock.gif
        if (_url != null && string.Compare(name, "action"true== 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif        value 
= _url;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
base.WriteAttribute(name, value, encode);
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

None.gif
None.gif
None.gif
None.gif    
internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif{
InBlock.gif        
private string _url;
InBlock.gif        
internal FormFixerHtmlTextWriter(TextWriter writer):base(writer)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif        _url 
= HttpContext.Current.Request.RawUrl;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public override void WriteAttribute(string name, string value, bool encode)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif        
if (_url != null && string.Compare(name, "action"true== 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif        value 
= _url;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
base.WriteAttribute(name, value, encode);
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif}

None.gif
None.gif}
None.gif

你把他封装成dll,以后只要添加引用就可以拉!
ok ,it is so easy!

转载于:https://www.cnblogs.com/wenanry/archive/2006/10/29/543182.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nine

nine Scarpy爬虫框架https://www.cnblogs.com/kermitjam/articles/10147261.html?tdsourcetags_pctim_aiomsg 高并发的爬虫框架 Runspider只能执行某个 爬虫程序.py文件 将项目根目录导入 Xpath语法 获取内容&#xff08;‘./text()’) 发送请求 ---> 获取响应数据 --->…

使用ActiveMQ –具有故障转移协议的“主/从”配置

介绍 ActiveMQ代理往往是企业中消息传递基础结构的核心部分。 此消息传递基础结构的高度可用性和可伸缩性至关重要。 请阅读此链接 &#xff0c;以了解有关创建经纪人网络以支持各种用例的更多信息。 ActiveMQ的流行用例之一是带有共享数据库的主/从配置。 使用此配置时&#x…

页面那些位置是投放广告的最佳位置

通常好的广告位置并非页面最上方的通栏广告&#xff0c;而是页面第一屏导航条下面中央和左侧的位置&#xff0c;此处放置广告会取得较好的效果。除此之外&#xff0c;页面中屏主要内容附件的位置为左侧和下侧较好&#xff0c;用户会第一时间注意到并关注这些广告。 转载于:http…

如何在Java中将字节数组转换为InputStream和OutputStream

您是否坚持使用编码&#xff0c;因为您有字节数组&#xff0c;并且链中的下一个方法需要InputStream&#xff1f; 不用担心Java有解决方案&#xff0c;您可以使用 ByteArrayInputStream 在Java中将字节数组转换为InputStream 。 此类使用字节数组作为源&#xff0c;并且由于它…

mysql 笔记打包下载_mysql 5.7压缩包安装笔记

重装系统之后准备安装mysql,看到官网上有mysql 5.7.10可以下载就点了,然后就开始了漫长的安装路程,总共折腾差不多一个多小时,最后终于安装成功了,这里把安装过程写下来,给自己做个笔记,也给后来人一个安装提示.1.下载安装包直接点击或者复制之后就可以下载了,不嫌麻烦或者想体…

Java 8 LongAdders:管理并发计数器的正确方法

我只是喜欢新玩具&#xff0c;而Java 8有很多 。 这次我想谈谈我的最爱之一-并发加法器。 这是一组用于管理由多个线程编写和读取的计数器的新类。 新的API有望显着提高性能&#xff0c;同时仍然使事情变得简单明了。 自从多核架构问世以来人们一直在管理并发计数器&#xff0…

JS中ptototype和__proto__的关系

学到原型的时候感觉头都大了/(ㄒoㄒ)/~~ 尤其是ptototype和__proto__ 傻傻分不清 通过多番查找资料&#xff0c;根据自己的理解&#xff0c;总结如下&#xff1a; 一、构造函数&#xff1a; 构造函数&#xff1a;通过new关键字可以用来创建特定类型的对象的函数。比如像Obje…

[最短路]飞行

题目描述 WFYZ的校园很大&#xff0c;这里生活着很多生物&#xff0c;比如住在钟楼上的的鸽子&#xff0c;其中鸽子冉冉和她的妹妹凝凝白天在不同的地方吃虫&#xff0c;而在晚上她们都回到钟楼休息。她俩是两只懒鸟&#xff0c;于是提出了一个计划&#xff0c;尽量减少她们在飞…

Java状态和策略设计模式之间的差异

为了在Core Java应用程序中正确使用状态和策略设计模式&#xff0c;对于Java开发人员清楚地了解它们之间的区别很重要。 尽管状态和策略设计模式的结构相似&#xff0c;并且都基于开放式封闭设计原则&#xff0c;从SOLID设计原则表示为“ O”&#xff0c;但它们在意图上完全不同…

廖雪峰Java3异常处理-1错误处理-2捕获异常

1捕获异常 1.1 finally语句保证有无错误都会执行 try{...}catch (){...}finally{...} 使用try...catch捕获异常可能发生异常的语句放在try{...}中使用catch捕获对应的Exception及其子类1.2 捕获多个异常 try{...} catch() {...} catch(){...}finally{..} 使用多个catch子句&…

更新数据库

方法一&#xff1a;在对SQL数据库进行更新时&#xff0c;用CommandBuilder对像来自动构建sql命令&#xff0c;来起到更新的作用;这种方法用起来比较方便&#xff0c;具体代码如下&#xff1a; 以下代码都在xp系统下测试通过 环境&#xff1a;vs.net2005 \ sql server 2000\xpus…

在崩溃或断电后测试Lucene的索引耐久性

Lucene有用的事务功能之一是索引持久性 &#xff0c;它可以确保一旦成功调用IndexWriter.commit &#xff0c;即使操作系统或JVM崩溃或断电&#xff0c;或者您杀死-KILL JVM进程&#xff0c;重启后索引也将保持完整&#xff08;未损坏&#xff09;&#xff0c;并将反映崩溃前的…

Jmeter、postman、python 三大主流技术如何操作数据库?

1、前言 只要是做测试工作的&#xff0c;必然会接触到数据库&#xff0c;数据库在工作中的主要应用场景包括但不限于以下&#xff1a; 功能测试中&#xff0c;涉及数据展示功能&#xff0c;需查库校验数据正确及完整性&#xff1b;例如商品搜索功能 自动化测试或性能测试中&a…

利用ASP.NET向服务器上传文件[转]

文件上传技术是一个很实用的技术&#xff0c;有着很广泛的应用&#xff0c;在ASP.NET自身的前一个版本ASP里实现这个功能&#xff0c;就必须使用第三方的组件或者自己开发组件了&#xff0c;现在&#xff0c;用ASP.NET实现起来就简单得多了&#xff0c;我们不需要使用任何组件就…

java中HashMap详解

HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员&#xff0c;其中 HashMap 是 Map 接口的常用实现类&#xff0c;HashSet 是 Set 接口的常用实现类。虽然 HashMap 和 HashSet 实现的接口规范不同&#xff0c;但它们底层的 Hash 存储机制完全一样&#xff0c;甚…

java代码编写的文本特征提取_Test1 java语言写的特征提取源代码,有搞文字识别的可以下载一看,简单易学 Develop 274万源代码下载- www.pudn.com...

文件名称: Test1下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 35 KB上传时间: 2015-03-02下载次数: 46提 供 者: 常杰详细说明&#xff1a;java语言写的特征提取源代码&#xff0c;有搞文字识别的可以下载一看&#xff0c;简单易学-Feature extraction of the Java …

c# HashTable (哈希表)

HashTable 哈希表 也是System.Collections集合下的数据结构类 它储存的也是Object类型的对象 但是它在内存中是散列排布的 因为这个特性&#xff0c;非常适合存储大量的数据 在HashTable中一个键只能对应一个值&#xff0c;一个值可以对应多个键&#xff08;多对一&#xff09;…

Spring集成–配置Web服务客户端超时

介绍 在Spring Integration的支持下&#xff0c;您的应用程序可以使用出站Web服务网关来调用Web服务。 调用由该网关处理&#xff0c;因此您只需要担心构建请求消息和处理响应。 但是&#xff0c;使用这种方法并不明显&#xff0c;如何配置其他选项&#xff0c;例如设置超时或操…

将txt文件和excel文件导入SQL2000数据库

在做一些web数据库管理系统的时候经常要实现将帐户批量注册的功能&#xff0c;今天就来讲讲如何在C#-web项目中将txt文件和excel文件导入SQL2000数据库。1.数据库准备在SQL2000数据库的实例数据库pubs中建立一个数据表txtInsert&#xff0c;字段很简单&#xff1a;id&#xff0…

Java 8 Friday:Java 8将彻底改变数据库访问

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 对于Java 8系列 &#xff0c;我们很荣幸主持Iu Ming-Yee Iu博士发表的非常相关的嘉宾帖子。 Iu …