asp.net中实现伪静态页面

来源:互联网 发布:当当网为什么网络异常 编辑:程序博客网 时间:2024/04/30 10:31

在开发中我们有时可能只想网站中的网页只以html后缀来展示,但是由于开发一般都是使用aspx后缀的页面,那怎么才能实现看起来像伪静态页面,但是实际上还是aspx页面的网站呢,下面的文章做个简单的介绍。

在此需要用到HttpApplication的类,它是.net中处理请求的重要对象,所有的访问页面的请求都会经过它,在这里需要借用它来实现。

这篇文章对其有比较细的介绍,http://www.cnblogs.com/kissdodog/p/3527922.html。

需求:

1.通过访问score.html来进行学生的登陆,真实地址为StudentLogin.aspx

2.当登陆成功后跳转的页面为scrore/112.html(112为学号),真实地址为Score.aspx?sid=112


步骤1:实现对HttpApplication事件的处理

(1)在这里需要新建一个类,继承接口IHttpModule,接口里面有Dispose与Init方法需要实现,方法如下。在Init方法里面可以对HttpApplication的相关事件添加方法,这里只使用其中的2个。

    /// <summary>    /// 在Asp.net中,创建在System.Web命名空间下的IHttpModule接口专门用来定义HttpApplication对象的事件处理。实现IHttpModule接口的类称为HttpModule(Http模块)    /// </summary>    public class ReWriteUrl : IHttpModule    {        public ReWriteUrl()        {        }        public void Dispose()        {        }        /// <summary>        /// 在这个方法里面可以对需要的事件进行注册        /// Init在新创建HttpApplication对象实例时会调用一次,后面就不会再调用了        /// </summary>        /// <param name="context"></param>        public void Init(HttpApplication context)        {            //Asp.net处理的第一个事件,表示处理的开始            context.BeginRequest += new EventHandler(context_BeginRequest);            //在当前请求的用户已获授权时发生            context.PostAuthorizeRequest += new EventHandler(context_PostAuthorizeRequest);        }    }

(2)上面实现了接口,还是不能使用的。还需要在web.config下面的System.web下面添加如下的节点。type为上面新建类的命名空间,name为类名。

<!--在Asp.net中,实现IHttpModule接口只是实现HttpModule的第一步,在Asp.net中所使用的HttpModule还必须在网站配置文件中进行注册才能真正生效,并在Asp.net中使用-->    <httpModules>      <add name="ReWriteUrl" type="ComModules.Handler.ReWriteUrl"/>    </httpModules>

在实现了上面的方法后,这个时候时候可以调试一下,随便新建个aspx的页面,在上面的类的init方法里面加个断点,就会发现在访问具体页面之前会先执行此处的代码,将事件绑定上相关的方法。

步骤2:在方法里面写具体的处理办法,主要是通过正则表达式,将访问页面的url地址用预设的表达式进行验证,如果满足条件的话就进行处理。

/// <summary>        /// Asp.net处理的第一个事件,表示处理的开始        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        public void context_BeginRequest(object sender, EventArgs e)        {            HttpApplication _app = (HttpApplication)sender;            //原始地址            string _url = _app.Request.RawUrl;            foreach (RewriteUrlConfig key in GetConfig())            {                Regex reg = new Regex(key.UrlRuleKey, RegexOptions.IgnoreCase);                if (reg.IsMatch(_url))                {                    //如果是需要跳转到sroce.aspx页面,需要将配置信息进行保存,后面会使用                    if (key.RewriteUrl.IndexOf('?') > 0)                    {                        _app.Context.Items.Add("RewriteUrlConfig", key);                        _app.Context.Items.Add("Param", reg.Match(_url).Value);//获取到的学生ID                    }                    else//如果是需要跳转到登陆页面的,直接跳转                    {                        _app.Context.RewritePath(key.RewriteUrl);                    }                    break;                }            }        }        /// <summary>        /// 在当前请求的用户已获授权时发生        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        public void context_PostAuthorizeRequest(object sender, EventArgs e)        {            string _rewriteurl = "";            HttpApplication _app = (HttpApplication)sender;            //如果访问的页面为112.html,则表示需要跳转到score.aspx?sid=112            if (_app.Context.Items.Contains("RewriteUrlConfig") && _app.Context.Items.Contains("Param"))            {                RewriteUrlConfig _url = _app.Context.Items["RewriteUrlConfig"] as RewriteUrlConfig;                _rewriteurl = _url.RewriteUrl;                string _params = _app.Context.Items["Param"].ToString();                Regex _reg = new Regex(_url.ParamRuleKey, RegexOptions.IgnoreCase);                if (_reg.IsMatch(_url.RewriteUrl))                {                    foreach (Match _match in _reg.Matches(_url.RewriteUrl))                    {                        //将配置里url地址中的【$1】用具体的学生ID代替                        _rewriteurl = _rewriteurl.Replace(_match.Value, _params);                    }                }            }            else//如果为其他页面            {                //原始url                _rewriteurl = _app.Request.RawUrl;                //将访问页面包含StudentLogin.aspx或Score.aspx关键字的页面跳转到正确地址(可能用户具体的网址有些忘记了,但是他们是想访问这些页面的)                foreach (RewriteUrlConfig key in GetConfig())                {                    Regex _reg = new Regex(key.RewriteRuleKey, RegexOptions.IgnoreCase);                    if (_reg.IsMatch(_app.Request.Url.AbsolutePath))                    {                        if (key.RewriteUrl.IndexOf("?") > 0)                        {                            _rewriteurl = key.RewriteUrl.Substring(0, key.RewriteUrl.IndexOf("?")) + _app.Request.Url.Query;                        }                        else                        {                            _rewriteurl = key.RewriteUrl;                        }                        break;                    }                }            }            _app.Context.RewritePath(_rewriteurl);        }        /// <summary>        /// 配置哪些类型的地址需要重定向        /// </summary>        /// <returns></returns>        private List<RewriteUrlConfig> GetConfig()        {            List<RewriteUrlConfig> list = new List<RewriteUrlConfig>();            //此配置为,用户访问score.html时跳转到登陆页面            RewriteUrlConfig objConfig = new RewriteUrlConfig();            objConfig.ParamRuleKey = @"\$\d+";            objConfig.UrlRuleKey = @"\bscore\.html\b"; //请求地址正则表达式,用于检查此地址是否需要重定向            objConfig.RewriteUrl = @"~/StudentLogin.aspx";//重写地址,地址重定向后的新地址            objConfig.RewriteRuleKey = @"\/StudentLogin\.aspx";//重写后地址回发正则表达式            list.Add(objConfig);            //此配置为,用户访问[studentid].html时跳转到真实的Score.aspx            objConfig = new RewriteUrlConfig();            objConfig.ParamRuleKey = @"\$\d+";  //此表达式用来匹配RewriteUrl中的【$1】            objConfig.UrlRuleKey = @"\b(?<=score\/)\d+(?=\.html\b)";            objConfig.RewriteUrl = @"~/Score.aspx?sid=$1";            objConfig.RewriteRuleKey = @"\/Score\.aspx";            list.Add(objConfig);            return list;        }

步骤3:测试,在完成上面2步后,浏览score.html就会发现真实是跳转到了StudentLogin.aspx,点击登录页面上的按钮后,跳转的地址为score/112.html,实际上为score.aspx?sid=112


0 0
原创粉丝点击