欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET实现伪静态网页方法小结

程序员文章站 2024-02-21 12:16:40
本文实例总结了asp.net实现伪静态网页方法,分享给大家供大家参考之用。具体方法如下: 方法一:利用httphandler实现url重写(伪url及伪静态) 我们有时...

本文实例总结了asp.net实现伪静态网页方法,分享给大家供大家参考之用。具体方法如下:

方法一:利用httphandler实现url重写(伪url及伪静态)

我们有时候会见到这样的地址:“http://www.xxxx.com/show-12-34.html”,你或许认为在站点服务器根目录“/”下存在名为“show-12-34.html”的文件,其实实际它可能是不存在的,而可能你看到的内容是“/aspx/show.aspx?type= 12&id=34”的内容,为什么要这样做呢?原因有多个方面:首先是增强url的友好性,记“show-12-34.html”总比 “/aspx/show.aspx?type=12&id=34”好记吧?其次就是方便搜索引擎收录,很多搜索引擎更看好静态html页,比如:百度;其次就是出于安全性的考虑,因为这样隐藏了参数“type”、“id”。是不是很有意思呢?

其实这是利用url重写实现的,下面我就说一下在asp.net2.0下我所知道的最简单的实现方法:通过实现接口“ihttphandler”来接管http请求,follow me!

1.在资源管理方案中添加一个类,类的代码如下:

//类urlrewriter程序清单: 
using system; 
using system.data; 
using system.configuration; 
using system.web; 
using system.web.security; 
using system.web.ui; 
using system.web.ui.webcontrols; 
using system.web.ui.webcontrols.webparts; 
using system.web.ui.htmlcontrols; 
/// <summary> 
/// urlrewriter url重写类 
 /// author:yoyo 
/// </summary> 
public class urlrewriter : ihttphandler //实现“ihttphandler”接口 
{ 
 public urlrewriter() 
{ 
// 
// todo: 在此处添加构造函数逻辑 
 // 
} 
public void processrequest(httpcontext context) 
{ 
try 
{ 
//取得原始url屏蔽掉参数 
string url = context.request.rawurl; 
//建立正则表达式 
  system.text.regularexpressions.regex reg = new system.text.regularexpressions.regex 
  (@"/show-(\d+)-(\d+)\..+",system.text.regularexpressions.regexoptions.ignorecase); 
//用正则表达式进行匹配 
system.text.regularexpressions.match m = reg.match(url,url.lastindexof("/"));//从最后一个“/”开始匹配 
if (m.success)//匹配成功 
{ 
string realpath = @"~/aspx/show.aspx?type=" + m.groups[1] + "&id=" + m.groups[2]; 
//context.response.write(realpath); 
//context.rewritepath(realpath);//(rewritepath 用在无 cookie 会话状态中。) 
context.server.execute(realpath); 
} 
else  
{ 
context.response.redirect(context.request.url.tostring()); 
} 
} 
catch 
{ 
context.response.redirect(context.request.url.tostring()); 
} 
} 
/// <summary> 
/// 实现“ihttphandler”接口所必须的成员 
/// </summary> 
/// <value></value> 
/// author:yoyo 
public bool isreusable 
{ 
get { return false; } 
}
}

2.在web.config文件还要添加以下设置项

在<system.web>节点下添加如下代码:

<httphandlers> 
<add verb="*" path="*/show-?*-?*.aspx" type="urlrewriter" /> 
</httphandlers>

解释一下:

verb是指允许的动作“get”、“post”、“put”中的一种或几种,星号“*”表示全部允许;

path是指匹配路径,支持简单的通配符;

type是指绑定的类名以及包括命名空间(如果有的话);

对了,首先你要建立一个web窗体“show.aspx”在目录“aspx”下,因为这个文件就是实际接受请求并显示相关内容的页面。

ok!,编译,打开网站输入地址http://localhost:80/show-12-34.aspx 访问一下,检查看是不是显示的“/aspx/show.aspx?type=12&id=34”的内容呢?!

上面我是设置了匹配aspx文件,因为iis里.html扩展名默认是不归asp.net接管的,如果要接管html请求,
请将iis的扩展名.html映射到“c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll”,
然后将上面的aspx改成html:

<httphandlers> 
<add verb="*" path="*/show-?*-?*.html" type="urlrewriter" /> 
</httphandlers>

现在打开网站输入地址http://localhost:80/show-12-34.html 访问一下~!

方法二:地址重写、使用伪静态、页面回发处理

制作网站页面的时候,有时候为了用户的体验和搜索引擎的收录,很多网站经常使用伪静态地址重写,或者称为 url地址重写的办法,来将诸如:myebook.aspx?id=1,myebook.aspx?id=2myebook.aspx?id=3等带有参 数的动态页面伪装成为一个静态页面,比如,将以上的伪装成为my1.html,my2.html,my3.html等等诸如此类!

出发点是很好的,不仅有利于用户体验,也有利于收录,实在是一举两得!

好处已讲,现在来谈谈使用这种办法所存在的毛病,问题就在于,当你使用伪静态技术的页面有按钮,需要提交内容时,这个时候,一旦与服务器之间有回发动作, 那么,地址栏里面显示的网页地址就不再是伪装出来的my1.html,my2.html,my3.html等等拉,而是变为myebook.aspx? id=1,myebook.aspx?id=2myebook.aspx?id=3等等洛,如此一来,会让不太懂网页制作的网友感到不安,他们会认为自己 在上一个骗子网站,认为自己提交的数据都被另外一个网站给偷走了,总之,给他们的感觉就是,这样的网站具有欺骗性质;很可能,以后他们再也不敢上你的网站 了!!!………

下面本人就个人解决如上问题的心得体会做如下说明,希望能够帮助广大网友解决问题!

解决如上问题,有很多种办法,有使用javascript禁止回发,有将页面的

改为等等多种方法,反正能改的地方,都有人使用过了,并且,这样的文章比较多,但是难以实现,就本人脾气而已,更喜欢直接了当的办法,尽量少改地方,免得日后出错麻烦;

第一步:打开你的网站下面,新建一个类,文件名称大体如此:myactionlessform.cs

第二步:该类的代码如下:

using system; 
using system.io; 
using system.web; 
using system.web.ui; 
namespace myurl 
{ 
  public class myolpage : page 
  { 
    public myolpage() 
    { } 
    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); 
    } 
  } 
} 

之后,将这个类文件编译成为myactionlessform.dll文件,并在网站的项目中引用他,

第三步:打开具有回发操作的页面,将其中的:system.web.ui.page更改为: myurl.myolpage,如此而已,一劳永逸了,以后不再担心回发暴露真实地址吓走网友拉!

至此,大功可成一半多一点,接下来问题又来了,什么问题呢,你运行一下你的网站,是不是出现如下错误呀!

cs0433: 类型“myurl.myolpage”同时存在于“c:\windows\microsoft.net\framework\v2.0.50727\ temporary asp.net files\schoolit\3266aab1\aca2fc74\app_code.2-69spm5.dll”和“c:\windows\ microsoft.net\framework\v2.0.50727\temporary asp.net files\schoolit\3266aab1\aca2fc74\assembly\dl3\4d107fc6\00b753fe_ea19c801\ myactionlessform.dll”中

大体就是这样的错误了,针对这样的错误,有很多解决办法,有的地方说,删除临时使用的文件夹,删除某个命名 空间等等操作,俺都试过了,但是百试不得其果,后来俺就自己想想,出现这样的错误无非就是两个文件同时存在,但是又不能重复使用,解决办法那还不简单,停 用一个,只使用一个就行了嘛

上面的,我们不是建立了一个myactionlessform.cs了吗,它存在app_code这个文件夹里面,另外一个是 myactionlessform.dll,两个文件内容完全一样,做好了,我们就不需要myactionlessform.cs了,我们只需要 myactionlessform.dll,那么,想方设法将前者弄走不就得了(本人建议将此文件排除项目,不提倡直接删除该文件,因为以后可能使用 到),本人做法是,在项目中直接排出myactionlessform.cs文件,经过测试,大功至此已结束!!!!

方法三:利用mircosoft urlrewriter.dll实现页面伪静态

昨天,转贴了一篇利用isapi筛选器来实现url伪静态的文章,我按照文章上的内容做,可是没有做出来,目前看来,该方法没有使用microsoft urlrewriter.dll这个方法好,至少我个人觉得,花了一个晚上的时间,终于研究出来了怎么利用这个dll文件来对asp.net页面实现静态 化了,其实很简单。
一、获得mircosoft urlrewriter.dll
获得mircosoft urlrewriter.dll可以到http://www.microsoft.com/china/msdn/library/webservices/asp.net/urlrewriting.mspx?mfr=true
这里,选择[下载本文的源代码],下载完毕后,导入工程,我这里没有对该工程做任何修改,保留了原来的重写方式,然后直接在vs2005里面生成.dll文件就可以了。
二、使用该dll文件

添加引用,搞定。

三、页面方面的设计,这里不在赘述了,我会放一个下载包,有兴趣的朋友下载来看看吧,代码写的比较乱。

四、web.config的配置
这部是非常关键的,也是静态化能否成功的关键。

<?xml version="1.0"?> 
<configuration> 
 <configsections> 
  <section name="rewriterconfig" type="urlrewriter.config.rewriterconfigserializersectionhandler, urlrewriter" /> 
 </configsections> 
 
 <rewriterconfig> 
    <rules> 
      <rewriterrule> 
        <lookfor>~/web/new/type/(.[0-9]*)\.html</lookfor> 
    <sendto>~/web/new.aspx?id=$1</sendto> 
      </rewriterrule> 
   <rewriterrule> 
    <lookfor>~/web/index.html</lookfor> 
    <sendto>~/web/index.aspx</sendto> 
   </rewriterrule> 
    </rules> 
  </rewriterconfig> 
  <system.web> 
  <httphandlers> 
   <add verb="*" path="*.aspx" type="urlrewriter.rewriterfactoryhandler, urlrewriter" /> 
   <add verb="*" path="*.html" type="urlrewriter.rewriterfactoryhandler, urlrewriter" /> 
  </httphandlers> 
    <compilation debug="true"/></system.web> 
</configuration> 

这里简单介绍一下:

<rewriterconfig> 
  <rules> 
  <rewriterrule> 
   <lookfor>要查找的模式</lookfor> 
   <sendto>要用来替换模式的字符串</sendto> 
  </rewriterrule> 
  <rewriterrule> 
   <lookfor>要查找的模式</lookfor> 
   <sendto>要用来替换模式的字符串</sendto> 
  </rewriterrule> 
  </rules> 
</rewriterconfig> 

httphandlers的设置主要是配合iis将请求重新定义处理,这里也比较关键,如果不存在合理的httphandlers,那么,访问肯定会失败的。

关于正则表达式,可以到百度里搜索:"常用正则表达式",会有很多。

五.配置iis解析.html文件

右键点我的电脑-->管理-->展开'服务和应用程序'-->internet信息服务-->找到你共享的目录-->右键 点击属性 -->点击'配置'-->映射下面 -->找到.aspx的可执行文件路径 复制路径-->粘贴路径-->扩展名为".html"-->然后把检查文件是否存在的勾去掉这样就可以了,如果遇到“确定”按钮失效, 可以用键盘事件编辑路径即可解决。

本文实例代码点此本站下载

相信本文所述对大家的asp.net程序设计有一定的借鉴价值。