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

本文实例总结了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程序设计有一定的借鉴价值。

(0)

相关推荐

  • aspnetpager重写url(伪静态)配置实例

    复制代码 代码如下: <webdiyer:AspNetPager UrlPaging="true" EnableUrlRewriting="true"  UrlRewritePattern="/bidding/list_%tid%_%cityid%_{0}_%isProvince%.aspx"  ID="pager" CssClass="page" runat="server" O

  • asp.net core mvc实现伪静态功能

    在大型网站系统中,为了提高系统访问性能,往往会把一些不经常变得内容发布成静态页,比如商城的产品详情页,新闻详情页,这些信息一旦发布后,变化的频率不会很高,如果还采用动态输出的方式进行处理的话,肯定会给服务器造成很大的资源浪费.但是我们又不能针对这些内容都独立制作静态页,所以我们可以在系统中利用伪静态的方式进行处理,至于什么是伪静态,大家可以百度下.我们这里就来介绍一下,在asp.net core mvc中实现伪静态的方式. mvc框架中,view代表的是视图,它执行的结果就是最终输出到客户端浏览

  • iis6伪静态重写路径的配置步骤(.net项目)

    第一步:在网站项目涨添加URLRewriter程序集的引用和FormRewriterControlAdapter程序集引用. 注:如果项目中有分页,那么需要添加"FormRewriterControlAdapter"程序集引用,否则不需要添加该引用. 下载地址:http://www.net.cn/service/ziliao/cpsc/200906/3842.html(万网/帮助中心(M享主机UrlRewrite组件和使用手册)) 第二步:配置webconfig文件: 注意事项:1.参

  • ASP.NET URL伪静态重写实现方法

    在web.config里设置如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?> <!--overred--> <configuration> <configSections> <section name="RewriterConfig"type="URLRewriter.Config.RewriterConfigSeriali

  • win2003 iis asp.net伪静态配置图解

    一.[系统环境] 操作系统:windows2003 软件:iis 6.0 .net2.0以上 二.[配置伪静态步骤] 1.右键点击 要设置网站的网站 2.属性 -->主目录 -->配置--> 3.如右侧窗口,找到 .aspx 扩展名-->编辑-->复制 可执行文件的路径-->关闭 4.点击 添加-->粘贴 刚复制的 可执行文件路径 5.扩展名填写 .html (如果是 .htm 或者 任意你想要的扩展都可以 前提是以后的应用程序扩展列表里边没有该扩展) 6.不选中

  • ASP.NET网站伪静态下使用中文URL的方法

    首先解释一下,什么是中文URL呢?它并不是我们常见的把汉字编码为 %CF%EC 这种形式,而是在URL中直接使用汉字 这种形式目前还不是很多见.因为不同的浏览器处理起来可能会有所不同,不过据我测试,IE8和Firefox是完全支持的. 它的好处是可以使用链接地址看起来非常直观易懂!搜索引擎也支持. 先讲一下我的ASP.NET网站的伪静态,我的文件都是以.htm结尾的,实际上是动态的ASP.方法是:在后台将htm映射为aspx文件. 伪静态的规则,是在web.config文件中定义的. 形式一:

  • ASP.NET MVC3的伪静态实现代码

    现在开始研究第一步,如何定义自己的路由规则,达到伪静态的功能需求. 基本实现原理如下图: 首先,关于命名空间. 路由的功能是为了让所有Asp.net网站开发都可以使用,所以dll并没有在MVC中,而是在System.Web中的System.web.Routing. 现在我们为了我们实际的需求,实现MVC3中的自定义路由功能(继承RouteBase,重写RouteData和VirtualPathData). 下面的例子实现以下目的:输入一个youdomin.com/product/123.html

  • asp.net伪静态配置备忘

    总之,感觉网站的URL上面有参数是一件很别扭的事情,一方面很容易被注入,另一方面,参数传递很容易泄露一些有用的信息. 而这篇文章主要针对的是网站URL显示的伪静态化,这样就抛弃了直接生成纯静态页的麻烦,而且能够很好的保护用户隐私,同时网站安全性也会有一定性能的提升. 主要操作过程如下: 首先,我们需要一个微软的URLReWriter组件,这里的下载地址我给提供下: http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a0

  • asp.net下通过泛解析和伪静态实现二级域名的实现方法

    虽然最后是实现了,但身为程序员的我,却总是感觉利用其他不开源的组件自己总把握不了技术的核心.其实在net中微软已经为我们留下了接口,让我们为所欲为了. 首先我们可以通过一张图大概了解下.net的生命周期. 从 上图可以看出来,针对每个不同用户的请求,服务器都会创建一个新的HttpContext实例直到请求结束,服务器销毁这个实例.而 Ihttpcontext是httpcontext对外公开的接口,它包含了2个方法:dispose()和Init(HttpApplication context),我

  • asp.net不用设置iis实现url重写 类似伪静态路由

    程序要调整的部分只有两块.一是web.config文件.二是链接地址.所需urlrewrite.dll 首先下载URLRewriter:http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi 下载安装后再bin目录下找到URLRewriter.dll文件 好了开始实施.第一步:将urlrewrite.dll下载到你的web程序目录里去.哪都行.我是

随机推荐