[C#][ASP.net] 簡單透過Global.asax 的 Application_BeginRequest 做 rewrite
2013-04-02
因為一些需求,需要動態製作Rewrite 條件且切換樣板..
所以簡單研究紀錄一下,免得之後忘記,現在Rewrite 方法很多,不一定要用這種方法.
專案有三個檔案夾(樣板),都有各自的 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)
{
}
}
}
結果
source: