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

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

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中,代码如下:

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;
        }


    }
原文地址:https://www.cnblogs.com/chendaoyin/p/2878629.html