zoukankan      html  css  js  c++  java
  • 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;
            }


        }
  • 相关阅读:
    获取Android控件宽高
    Android面试题:大图加载,防止OOM
    Android面试题:讲一讲Glide的原理
    面试题:实现一个容器,提供两个方法,add,size;写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束
    Java线程中断的三种方法
    Java的四种引用:强引用、软引用,弱引用和虚引用
    Bellman-Ford(可解决负权边)--时间复杂度优化
    【Leetcode 动态规划、深度优先搜索】不同路径(62)、 不同路径 II(63)、不同路径 III(980)
    ElasticSearch scroll分页查询
    MySQL Myisam引擎和Innodb引擎的区别
  • 原文地址:https://www.cnblogs.com/chendaoyin/p/2878629.html
Copyright © 2011-2022 走看看