Asp.net 中伪静态的应用与实现

- 首页 >> Web


摘要:介绍位静态的概念,通过Http的请求过程详细阐述了伪静态的实现原理,并使用HttpmouduleURLRewriter.dllGlobal.asax.cs 实现了对url 的重写。

我们在上网时,不可避免的要用到各种各样的网址,这些网址有一个共同特点,那就是有各种后缀,如.html.aspx.php等。这些后缀都是什么意思呢,.html.htm.shtml这些一般情况下都是静态页面,而.aspx.php等一般都是动态页面。然而后缀为.html.htm这些,但是页面为动态页面的情况是什么呢?下面我们将做介绍。

1 伪静态的概念及实现原理

在介绍伪静态之前,我们先简单了解下静态页面和动态页面。静态页面是存在与服务器之上,无需经过服务器编译,直接加载到用户浏览器上显示出来,通常具有.htm.html后缀。动态页面是以ASPJSPC#等编程语言制作的页面,在服务器上实际上不存在此页面,当客户端向服务器发出请求时,动态页根据预先制定好的模板,通过加载数据库中的对应数据,形成对应的页面,发送给客户端,动态页面通常具有.aspx.php等后缀,且网址较长,带有?符号。

伪静态,用简单的话说就是伪装成静态页面的动态页。那么动态的页面为什么要伪装成静态页面呢。伪装成静态页面可以有以下好处:网址剪短,易于输入,可以隐藏一些不必让用户看到的东西,易于记忆,利于搜索引擎的抓取。那么伪静态是怎么实现的呢?在说明这个问题之前需要先了解http的请求过程。一次需客户端和服务器段建立连接,客户

端在发出请求信息,服务器端回送相应信息,关闭连接。如图1。图1那服务器端是怎么处理这个请求的呢?当服务器接受到请求时,web服务器将请求会交给iis处理,如果请求的是.htm后缀的静态页面,iis直接将服务器端数据发送给客户端,关闭连接,请求结束,当请求的后缀是.aspx时,这时iis无法处理这个请求,就会将这个请求交给aspnet_isapi.dll 来处理,由aspnet_isapi.dll 处理后生成的静态.html内容返回给iis,在由iis发送给客户端。在ASP.NET 之前,需要使用ISAPI 筛选器来实现IIS Web 服务器上的URL 重写。由于ASP.NET 引擎与IIS 非常相似,因此可以使用ASP.NET 进行URL 重写。下图描述了如何处理对ASP.NET 资源的请求。首先,IIS 接收到请求,并将请求调度给aspnet_isapi.dll。接下来,ASP.NET 引擎对已配的HTTP 模块进行初始化。最后将调用正确的HTTP 处理程序,并呈现被请求的资源,将所生成的标记返回给IIS 和请求客端。与IIS 一样,ASP.NET 引擎在请求的

Computer Knowledge and Technology 电脑知识与技术第9卷第34 (2013 12 )

软件设计开发本栏目责任编辑:谢媛媛

有效期内将会触发事件,通过发信号来表示其处理过程从一个状态改变为了另一个状态,如:BeginRequest事件在ASP.NET开始响

应客户端请求之始引发;AuthenticateRequest事件在ASP.NET确立用户身份后引发,当然还有诸如AuthorizeRequestResolveRe

questCacheEndRequest等其它很多事件。每次http请求都得经过这里的处理,这样,我们就可以再这里通过对请求的url的重写,

来实现伪静态。

2 通过url 重写实现伪静态的几种方法。

2.1 httpmoudule 来实现网址重写:

public class Urlrewriter:IHttpModule //实现IhttpModule接口

{

private HttpApplication appl = null;

public Urlrewriter()

{}

public void Dispose()

{}

public void Init(HttpApplication context)

{

//注册开始请求的事件,当有任意的请求时都引发这个事件

context.BeginRequest += newEventHandler(context_BeginRequest);

appl = context;

}

private void context_BeginRequest(objectsender, EventArgs e)

{

string oldUrl =appl.Context.Request.RawUrl; //获取请求的url

//处理url

if (oldUrl.Contains(".html"))

{

//重写URL

string newUrl =oldUrl.Replace(".html", ".aspx");

appl.Context.RewritePath(newUrl);

}}}

Web.Config文件,在<System.web>节点下添加配置:

<httpModules>

<add name="urlModule"type="UrlModule"/>

</httpModules>

2.2 通过微软提供的URLRewriter.dll 来实现网址重写:

1)将URLRewriter.dll文件放在网站的bin目录中

2)修改web.config文件如下:

<configSections>节点下添加:

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

<configuration>节点下添加:

<RewriterConfig>

<Rules>

Computer Knowledge 9卷第34 (201312) and Technology电脑知识与技术

本栏目责任编辑:谢媛媛软件设计开发

<RewriterRule>

<LookFor>~/(.*)-(.*)\.html</LookFor><!LookFor中是请求的URL格式—>

<SendTo>~/$1.aspx?id=$2</SendTo><!SendTo中是实际的URL格式→

</RewriterRule>

</Rules>

</RewriterConfig>

<httpHandlers>节点下添加:

<add verb="*"path="*.html" type="URLRewriter.RewriterFactoryHandler,URLRewriter" />

2.3 Global.asax.cs 中实现网址重写

Application_BeginRequest()方法中加入如下代码:

void Appliction_BeginRequest(object sender,EventArgs e)

{

string oldUrl =HttpContext.Current.Request.RawUrl;//获取当前请求的原始URL

if (oldUrl.Contains(".html"))

{

string newUrl =oldUrl.Replace(".html", ".aspx"); //.html后缀替换为.aspx

this.Context.RewritePath(newUrl); //使用给定路径重写URL

}

如果使用的是VS2005以上版本是没有Global.asax.cs这个文件的,需要添加Global.asax文件,在这个文件中手动添加Application_BeginRequest()方法,代码相同。到此,我们介绍了利用httpModuleURLRewriter.dllGlobal.asax.cs中的Appliction_BeginRequest()方法实现对URL的重写,从而实现伪静态,而在实现的过程中完全可以利用正则表达式的便利性来达到使用自己需要的各种格式的URL,以达到期望的效果。最后在说明下,虽然伪静态有很多好处,但是利用伪静态的同时,会给服务器造成额外的力,在实际项目中,需要我们综合考虑各种因素,合理配置各种资源,是网站拥有合理的性能,以达到最好的用户体验。

4 结束语

从以上分析可以看出,哈希函数在信息安全、数据结构以及数据挖掘等应用领域里起到的作用并不相同:或者把消息一一映射成摘要,或者把数据映射到地址,或者实现任务的均匀分配。因此信息安全领域最为严格,强调哈希函数的单向性、随机性和无碰撞性;数据结构里则主要强调尽量减少碰撞,而在数据挖掘里进行工作分配时关注的是碰撞的均匀性。所以也不能笼统地认为哈希值就是消息或者数据摘要,它在不同领域里也相应地具有不同的含义,起到不同的作用。


站长地图