URL重写

URL重写:

 

祥细的过程见:

http://www.cnblogs.com/scy251147/archive/2011/04/24/2026330.html

最简单的一种方式:http://yuweiqiang.blog.163.com/blog/static/66570412011723438599/(不用实现IHttpModules接口)

为什么要URL重写?

1、有利于SEO,带参数的URL权重较低;2、地址看起来更正规,推广uid

 

    浏览器通过URL向服务器发送一个页面请求的时候,中间要经过“过滤器”,过滤器是早就写好的。如果程序员要在其中间加一些东西,可以通过给上下文对象添加事件的方式来做。重写URL就是其中的一种。

    下面介绍重写URL的步骤:

  第一种方法(稍显复杂)

    (1)、新建一个类,让这个类实现IHttpModule接口(注意如果是新建的类库,要先添加外部System.Web的引用才行)。

    (2)、实现接口中的方法:(不用管Dispose方法的实现)

public void Init(HttpApplication context)

        {

            context.BeginRequest += new EventHandler(My _BeginRequest);

        }

    BeginRequest委托是最早可以被调用的,其它那些可以被调用的委托参考下面。

    (3)、实现My_BeginRequest方法(这个方法名是自己取的)

    如:把一个View.2aspx的URL请求重写成:View.aspx?id=2,代码如下:

public void My_BeginRequest(object sender, EventArgs e)

        {

            HttpApplication ha = sender as HttpApplication;

            string requestPath=ha.Request.Path;

            string extentionPath = Path.GetFileName(requestPath);

 

            Match match = Regex.Match(extentionPath, @"^View.(\d{1})aspx$");

            if (match.Success)

            {

                string num = match.Groups[1].Value;

       //server.Transfer也可以实现重定向的功能

       //但是如果传了COOKIE就不能传过去。所以最好还是用RewritePath

                ha.Context.RewritePath("View.aspx?id="+num);

            }

        }

    (4)、配制web.config

        在</system.web>下面加如下配制

第一种,如果新建的是一个类

<httpModules>

      <add name="MyModuls" type="MyModuls"/>

</httpModules>

第二种,如果新建的是一个类库

<httpModules>

      <add name="MyModuls" type="MODULS.MyModuls,MODULS"/>

</httpModules>

其中:name可以任取

如果是类库:type中第一个MODULS代表前面添加的类所在的命名空间,MyModuls代表这个类的名字。第二个MODULS代表程序集的名字。

如果是类:type中就只有一个参数,那就是类名。

 

第二种方法(简单):

  在Global.asax的Application_BeginRequest方法中,直接重写,重写方法参考第一种,用的方法是HttpContext.Current.RewritePath();
     这种写法方不用配置Web.config,相对来说简单得多了。

 

这里提一个可能会纠结的问题:URL重写与Response.Redirect()有何区别?
  
Respose.Redirect();是客户端的请求己经到了它第一次所请求的页面,然后再重定向,也就是请求了两次,地址栏上的URL会变。而URL重写,则
没有请求到用户发地来的页面,直接转而去执行新的页面了,地址栏的地址不会变化。

 

 下面是过滤器中所有程序员可以操作的委托的执行顺序:

1.BeginRequest(在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生)

2.AuthenticateRequest (当安全模块已建立用户标识时发生。注:AuthenticateRequest 事件发出信号表示配置的身份验证机制已对当前请求进行了身份验证。预订 AuthenticateRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证。)

3.PostAuthenticateRequest (注意:该事件在 .NET Framework 2.0 版中是新增的。 当安全模块已建立用户标识时发生。PostAuthenticateRequest 事件在 AuthenticateRequest 事件发生之后引发。预订 PostAuthenticateRequest 事件的功能可以访问由 PostAuthenticateRequest 处理的任何数据。)

4.AuthorizeRequest (当安全模块已验证用户授权时发生。AuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。预订 AuthorizeRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证和授权。)

5.PostAuthorizeRequest (.NET 2.0里新增的事件。在当前请求的用户已获授权时发生。PostAuthorizeRequest 事件发出信号表示 ASP.NET 已对当前请求进行了授权。预订PostAuthorizeRequest 事件可确保在处理附加的模块或处理程序之前对请求进行身份验证和授权。)

6.ResolveRequestCache (当 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务时发生,从而跳过事件处理程序(例如某个页或 XML Web services)的执行。)

7.PostResolveRequestCache (在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生。)在 PostResolveRequestCache 事件之后、PostMapRequestHandler 事件之前创建一个事件处理程序(对应于请求 URL 的页)。

8.PostMapRequestHandler(在 ASP.NET 已将当前请求映射到相应的事件处理程序时发生。)

9.AcquireRequestState ***********注意:能使用到Session*******************

10.PostAcquireRequestState

11.PreRequestHandlerExecute(执行事件处理程序。)

12.PostRequestHandlerExecute ***********注意:能使用到Session*******************

13.ReleaseRequestState

14.PostReleaseRequestState (在PostReleaseRequestState 事件之后,响应筛选器(如果有)将对输出进行筛选。)

15.UpdateRequestCache

16.PostUpdateRequestCache

17.EndRequest

 

posted @ 2012-05-10 23:06  伯箫  阅读(319)  评论(0编辑  收藏  举报