[C#][ASP.net] 簡單透過Global.asax 的 Application_BeginRequest 做 rewrite

2013-04-02

 

因為一些需求,需要動態製作Rewrite 條件且切換樣板..
所以簡單研究紀錄一下,免得之後忘記,現在Rewrite 方法很多,不一定要用這種方法.

2013-04-02_144601

專案有三個檔案夾(樣板),都有各自的 index.aspx 它們會需要使用者的Key

當使用者輸入 http://localhost:21297/userA/ 程式會判 rewrite 到 http://localhost:21297/temp1/index.aspx?id=userA
當使用者輸入 http://localhost:21297/userB/ 程式會判 rewrite 到 http://localhost:21297/temp2/index.aspx?id=userB

如果使用者輸入 並非 userA 或是 userB 則會 rewrite 到 http://localhost:21297/temp3/index.aspx?id=Others

接下來直接來看我Global.asax

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
 
namespace ReWriteTesting
{
    public class Global : System.Web.HttpApplication
    {
        //模擬資料庫中的資料
        private static IDictionary<string, string> RewritePool;
 
 
        protected void Application_Start(object sender, EventArgs e)
        {
            //假設 裡面有兩筆資料
            //userA 對應 temp1 
            //userB 對應 temp2
            RewritePool = new Dictionary<string, string>();
            RewritePool.Add("userA", "temp1");
            RewritePool.Add("userB", "temp2");
 
 
        }
 
        protected void Session_Start(object sender, EventArgs e)
        {
 
        }
 
        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            //取得每一個reuqest網址
            string fullPath = Request.Url.ToString();
 
            //透過regex 解析
            var regex = new Regex(@"http://localhost:21297/(.+)$");
            var match = regex.Match(fullPath);
            if (!string.IsNullOrEmpty(match.Groups[1].Value))
            {
                if (RewritePool.ContainsKey(match.Groups[1].Value))
                {
                    Context.RewritePath("/" + RewritePool[match.Groups[1].Value] + "/index.aspx?id=" + match.Groups[1].Value);
                }
                else//如果沒有的話就導入到temp3
                {
                   
                    Context.RewritePath("/" + "temp3" + "/index.aspx?id=" + match.Groups[1].Value);
                }
 
            }
 
            //解析後面尾端帶斜線的
            //ex. http://http://localhost:21297/userA/
            regex = new Regex(@"http://localhost:21297/(.+)/$");
            match = regex.Match(fullPath);
            if (!string.IsNullOrEmpty(match.Groups[1].Value))
            {
                if (RewritePool.ContainsKey(match.Groups[1].Value))
                {
                    Context.RewritePath("/" + RewritePool[match.Groups[1].Value] + "/index.aspx?id=" + match.Groups[1].Value);
                }
                else//如果沒有的話就導入到temp3
                {
 
                    Context.RewritePath("/" + "temp3" + "/index.aspx?id=" + match.Groups[1].Value);
                }
 
            }
 
        }
 
        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
 
        }
 
        protected void Application_Error(object sender, EventArgs e)
        {
 
        }
 
        protected void Session_End(object sender, EventArgs e)
        {
 
        }
 
        protected void Application_End(object sender, EventArgs e)
        {
 
        }
    }
}

 


結果


2013-04-02_150616




source:


當麻許的超技八 2014 | Donma Hsu Design.