C#关于伪静态页面的两种实现方法

第一种是在页面global.asax中,相关代码如下:

ExpandedBlockStart.gif View Code
     void Application_BeginRequest( object sender, EventArgs e)
    {
        HttpContext context = ((HttpApplication)sender).Context;

         string oldurl = context.Request.Path.ToLower();

         if ( ( oldurl.IndexOf( " - ") >  0 && oldurl.IndexOf( " . ") == - 1) || (oldurl.IndexOf( " - ") >  0 && oldurl.IndexOf( " aspx ") >  0) )
        {
             string[] url = oldurl.Substring(oldurl.LastIndexOf( " / ") +  1).Replace( " .aspx """).Split( ' - ');

             string path = oldurl.Substring( 0, oldurl.LastIndexOf( " / ") +  1);
            
             // file
             string file = url[ 0];
            file = file.Replace( " about "" detail ");
            file = file.Replace( " news "" list ");
            file = file.Replace( " down "" detail ");
            file = file.Replace( " case "" album ");
            file = file.Replace( " contact "" detail ");
            
             // query
             string query =  "";
            
             for (  int i= 1;i<url.Length;i++ )
            {
                 if (url[i] !=  "")
                {
                     switch (i)
                    {
                         case  1:
                            query +=  " id= " + url[i];
                             break;
                            
                         case  2:
                            query +=  " &page= " + url[i];
                             break;

                         case  3:
                            query +=  " &key= " + url[i];
                             break;

                         case  4:
                            query +=  " &v1= " + url[i];
                             break;

                         case  5:
                            query +=  " &v2= " + url[i];
                             break;

                         case  6:
                            query +=  " &v3= " + url[i];
                             break;
                            
                         case  7:
                            query +=  " &v4= " + url[i];
                             break;

                         case  8:
                            query +=  " &v5= " + url[i];
                             break;

                         case  9:
                            query +=  " &v6= " + url[i];
                             break;
                            
                         case  10:
                            query +=  " &v7= " + url[i];
                             break;
                   }
                }
            }
    
             // newurl
             string newurl = path + file +  " .aspx? " + query;
            
             if( context.Request.ServerVariables[ " QUERY_STRING "] !=  null && context.Request.ServerVariables[ " QUERY_STRING "] !=  "" )
                newurl +=  " & " + context.Request.ServerVariables[ " QUERY_STRING "];
            
             // Response.Write(newurl);
            context.RewritePath(newurl);
        }

第二种方法是在HttpModule.cs中,代码如下:

ExpandedBlockStart.gif View Code
public  class HttpModule : IHttpModule
    {
         private  const RegexOptions regexOptions = RegexOptions.IgnoreCase | RegexOptions.Compiled;
         private  static  readonly Regex regexFileName =  new Regex( @" .*?/([^./]*)\.aspx(.*) ", regexOptions);
         private  static  readonly Regex regexRewritePath =  new Regex( @" ^.*?/(\w*)(-?(\w+)-([\w,\|,%]+))+\.aspx ", regexOptions);

         public  void Dispose()
        {
        }

         public  void Init(HttpApplication httpApplication)
        {
            httpApplication.BeginRequest += ReUrl_BeginRequest;
        }

         private  static  void ReUrl_BeginRequest( object sender, EventArgs e)
        {
            Globals.Catch(
                () =>
                {

                     var context = ((HttpApplication)sender).Context;
                     var request = context.Request;
                     var url = request.Url;
                     if (!VerifyUrl(url))
                    {
                         string input = url.PathAndQuery.ToLower();
                         // Loger.Debug("PathAndQuery-->" + input);
                        
// Loger.Debug("AbsolutePath-->" + url.AbsolutePath);
                        
// Loger.Debug("AbsoluteUri-->" + url.AbsoluteUri);
                        
// Loger.Debug("DnsSafeHost-->" + url.DnsSafeHost);
                        
// Loger.Debug("LocalPath-->" + url.LocalPath);
                        
// Loger.Debug("AppDomain.CurrentDomain.BaseDirectory-->" + AppDomain.CurrentDomain.BaseDirectory);
                        
// Loger.Debug("Globals.GlobalsVirtualFilePath-->" + Globals.GlobalsVirtualFilePath);
                         if (input.StartsWith(Globals.GlobalsVirtualFilePath))
                            input = input.Remove( 0, Globals.GlobalsVirtualFilePath.Length);
                         string viewmode = Globals.ViewMode;
                         var themeName = request.QueryString[ " theme "] ??  "";
                         if ( string.IsNullOrEmpty(themeName))
                        {
                            themeName = Globals.ThemeName;
                        }
                         if (input ==  " / ")
                            input =  " /index.aspx ";
                         if (viewmode ==  " Rewrite ")
                        {

                            Loger.Debug( " now input--> " + input);
                            Match match = regexRewritePath.Match(input);
                             if (match.Success && match.Groups.Count ==  5)
                            {
                                 var captures3 = match.Groups[ 3].Captures;
                                 var captures4 = match.Groups[ 4].Captures;
                                 var itemCount = match.Groups[ 3].Captures.Count;
                                 var list =  new List< string>();
                                 for ( var i =  0; i < itemCount; i++)
                                {
                                    list.Add( string.Concat(captures3[i].Value,  " = ", captures4[i].Value));
                                }
                                context.RewritePath(Globals.AspxFileUrl(themeName, match.Groups[ 1].Value +  " .aspx? " +  string.Join( " & ", list.ToArray())));
                                 return;
                            }
                        }
                         var fileName = regexFileName.Match(request.Path.ToLower()).Groups[ 1].ToString();
                         if ( string.IsNullOrEmpty(fileName))
                             return;
                         new ConvertTheme(context)
                        {
                            ThemeName = themeName,
                            ViewMode = viewmode
                        }.Display(fileName);
                    }

                });
        }
         private  static  bool VerifyUrl(Uri uri)
        {
             var url = uri.AbsolutePath.ToLower();
             if (url.StartsWith(Globals.GlobalsVirtualFilePath))
                url = url.Remove( 0, Globals.GlobalsVirtualFilePath.Length);
             return uri.IsFile
           || url.IndexOf( " site ") != - 1
           || url.IndexOf( " sys ") != - 1
           || url.IndexOf( " html ") != - 1
           || url.IndexOf( " user ") != - 1
           || url.IndexOf( " bbs ") != - 1
           || url.IndexOf( " _module.aspx ") != - 1
           || url.IndexOf( " webresource.axd ") != - 1
           || url.IndexOf( " scriptresource.axd ") != - 1;
        }


    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值