The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

分享一個在 .NET / C# / ASP.NET 中修改網址結構的好方法

我們有個常見的功能是限制使用者導向到 SSL 的網頁,這時我們就必須修改 HTTP 要求(Request)的網址到 https 的網址,或是需要修改網址的部分結構(例如 schema 或 port 等等),這時我們可能會用字串取代 String.Replace 方法 (如下範例),但這種寫法有很多瑕疵,以下是本篇文章的分析報導。

第一種:無法區分大小寫,就是若遇到網址並非全部都大寫時,就會失敗。

string newUrl = Request.Url.ToString().Replace("http:", "https:");

第二種:此法會將 QueryString 弄壞,因為 UrlEncode 過的文字是必須需分大小寫的!

string newUrl = Request.Url.ToString().ToLower().Replace("http:", "https:");

第三種:自己重新組合網址 ( 可參考我這篇文章: ASP.NET 如何取得 Request URL 的各個部分)

string newUrl = Request.Url.Scheme + "://" + Request.Url.Authority + Request.RawUrl;

   第三種方法雖然可行,不過也不完美,因為網址的結構還包括很少見的 Username 與 Password 部分。

   例如以下網址都是有效且有用的 URL,由於網址的多變性讓我們自己組網址變得程式碼不漂亮:

ftp://username:password@example.com/Path/Filename.ext
http://username:password@example.com/Path/Filename.ext?key=val#hashid

最後,我的終極方案就是直接利用 .NET Framework 內建的 UriBuilder 類別幫我修改網址的部分元素,若是再搭配 C# 3.0 的 Object Initializers 特性那程式碼的可讀性將會非常高。

string u = new UriBuilder(Request.Url) { Scheme = Uri.UriSchemeHttps, Port = 443 }.ToString();

在 Visual Studio 中還有 Intellisense 可用,在開發介面方面也十分友善,我覺得算是個完美的解法。

UriBuilder 類別 

相關連結