分享一個在 .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 類別 

相關連結

  

此文章由 will 發表於 2009/9/3 下午 11:55:00

永久連結 | 評論 (1) | 此文章的RSSRSS comment feed |

分類: .Net | ASP.NET | C#

標籤: , , ,

評論

九月 4. 2009 01:19

Johnny

if (!Request.IsSecureConnection)
   Response.Redirect("https://" +
      Request.ServerVariables["HTTP_HOST"].ToString() +
      Request.ServerVariables["PATH_INFO"].ToString() + "?" +
      Request.ServerVariables["QUERY_STRING"].ToString());

Johnny 台灣

新增評論


( 您輸入的Email不會顯示於網站上 )

  Country flag

biuquote
  • 評論
  • 線上預覽
Loading