System.Uri類用於處理Uri地址信息,常用到它的地方有,相對Uri地址轉絕對Uri地址,獲取Uri的某部分信息等等,可以說是一個非常有用的類。
一、屬性
AbsolutePath 獲取 URI 的絕對路徑。
AbsoluteUri 獲取絕對 URI。
Authority 獲取服務器的域名系統 (DNS) 主機名或 IP 地址和端口號。
DnsSafeHost 獲得可安全用於 DNS 解析的未轉義主機名。
Fragment 獲取轉義 URI 片段。
Host 獲取此實例的主機部分。
HostNameType 獲取 URI 中指定的主機名的類型。
IsAbsoluteUri 獲取一個值,該值指示 Uri 實例是否為絕對 URI。
IsDefaultPort 獲取一個值,該值指示 URI 的端口值是否為此方案的默認值。
IsFile 獲取一個值,該值指示指定的 Uri 是否為文件 URI。
IsLoopback 獲取一個值,該值指示指定的 Uri 是否引用了本地主機。
IsUnc 獲取一個值,該值指示指定的 Uri 是否為統一命名約定 (UNC) 路徑。
LocalPath 獲取文件名的本地操作系統表示形式。
OriginalString 獲取傳遞給 Uri 構造函數的原始 URI 字符串。
PathAndQuery 獲取用問號 (?) 分隔的 AbsolutePath 和 Query 屬性。
Port 獲取此 URI 的端口號。
Query 獲取指定 URI 中包括的任何查詢信息。
Scheme 獲取此 URI 的方案名稱。
Segments 獲取包含構成指定 URI 的路徑段的數組。
UserEscaped 指示 URI 字符串在創建 Uri 實例之前已被完全轉義。
UserInfo 獲取用戶名、密碼或其他與指定 URI 關聯的特定於用戶的信息。
class Program { static void Main(string[] args) { Uri uri = new Uri("http://www.baidu.com:80/2013/123.html?id=1"); Console.WriteLine(uri.AbsolutePath); //輸出 /2013/123.html Console.WriteLine(uri.AbsoluteUri); //輸出 http://www.baidu.com/2013/123.html?id=1 Console.WriteLine(uri.Authority); //輸出 www.baidu.com Console.WriteLine(uri.DnsSafeHost); //輸出 www.baidu.com Console.WriteLine(uri.Fragment); //輸出 Console.WriteLine(uri.Host); //輸出 www.baidu.com Console.WriteLine(uri.IsAbsoluteUri); //輸出 True Console.WriteLine(uri.IsDefaultPort); //輸出 True Console.WriteLine(uri.IsFile); //輸出 False Uri uri1 = new Uri(@"D:\test\test.txt"); Console.WriteLine(uri1.IsFile); //輸出 True Console.WriteLine(uri.IsLoopback); //輸出 False Console.WriteLine(uri1.IsLoopback); //輸出 True Console.WriteLine(uri.IsUnc); //輸出 False Console.WriteLine(uri.LocalPath); //輸出 /2013/123.html Console.WriteLine(uri.OriginalString); //輸出 http://www.baidu.com:80/2013/123.html Console.WriteLine(uri.PathAndQuery); //輸出 /2013/123.html?id=1 Console.WriteLine(uri.Port); //輸出 80 Console.WriteLine(uri.Query); //輸出 ?id=1 Console.WriteLine(uri.Scheme); //輸出 http string[] strArr = uri.Segments; foreach (string str in strArr) { Console.WriteLine(str); //輸出 / 2013/ 123.html } Console.WriteLine(uri.UserEscaped); //輸出 False; Console.WriteLine(uri.UserInfo); //輸出 Console.ReadKey(); } }
二、方法
CheckHostName 確定指定的主機名是否為有效的 DNS 名稱。
CheckSchemeName 確定指定的方案名是否有效。
Compare 使用指定的比較規則比較兩個 URI 的指定部分。
EscapeDataString 將字符串轉換為它的轉義表示形式。
EscapeUriString 將 URI 字符串轉換為它的轉義表示形式。
FromHex 獲取十六進制數字的十進制值。
GetComponents 使用特殊字符的指定轉義,獲取當前實例的指定部分。
GetLeftPart 獲取 Uri 實例的指定部分。
GetObjectData 返回序列化當前實例所需的數據。
HexEscape 將指定的字符轉換它的等效十六進制字符。
HexUnescape 將字符的指定十六進制表示形式轉換為字符。
IsBaseOf 確定當前的 Uri 實例是否為指定 Uri 實例的基。
IsHexDigit 確定指定的字符是否為有效的十六進制數字。
IsHexEncoding 確定字符串中的一個字符是否為十六進制編碼。
IsWellFormedOriginalString 指示用於構造此 Uri 的字符串是否格式良好,以及它是否不需要進一步轉義。
IsWellFormedUriString 通過嘗試用字符串構造一個 URI 來指示字符串是否為格式良好的,並確保字符串不需要進一步轉義。
MakeRelativeUri 確定兩個 Uri 實例之間的差異。
TryCreate 已重載。 創建一個新的 Uri。在無法創建 Uri 時不引發異常。
UnescapeDataString 將字符串轉換為它的非轉義表示形式。
class Program { static void Main(string[] args) { Uri uri = new Uri("http://www.baidu.com:80/2013/123.html?id=1"); UriHostNameType unt = Uri.CheckHostName("http://www.baidu.com"); Console.WriteLine(unt.ToString()); //輸出Unknown UriHostNameType 是一個枚舉,定義主機名類型 Console.WriteLine(Uri.CheckSchemeName("http://www.baidu.com")); //輸出 False Console.WriteLine(Uri.CheckSchemeName("http")); //輸出 True Console.WriteLine(Uri.CheckSchemeName("https")); //輸出 True //Uri uri1 = new Uri("http://www.baidu.com"); //Uri.Compare(uri,uri1); //Uri.EscapeDataString對冒號(:)、斜杠(/)、空格、中文、井號(#)都進行了編碼,可對參數編碼 Console.WriteLine(Uri.EscapeDataString("http://www.baidu.com:80/2013/123.html?id=1")); //輸出 http%3A%2F%2Fwww.baidu.com%3A80%2F2013%2F123.html%3Fid%3D1 Uri轉義 //Uri.EscapeUriString對空格進行了編碼,也對中文進行了編碼,但對冒號(:)、斜杠(/)和井號(#)未編碼,所以此方法可以用於網址進行編碼,但不能對參數進行編碼 //Uri.EscapeUriString對URI的網址部分編碼,用Uri.EscapeDataString對URI中傳遞的參數進行編碼。 Console.WriteLine(Uri.EscapeUriString("http://www.baidu.com:80/2013/123.html?id=1&你好"));//輸出 http://www.baidu.com:80/2013/123.html?id=1&%E4%BD%A0%E5%A5%BD string str = "http%3A%2F%2Fwww.baidu.com%3A80%2F2013%2F123.html%3Fid%3D1"; Console.WriteLine(Uri.UnescapeDataString(str)); //輸出 http://www.baidu.com:80/2013/123.html?id=1 , 將Url還原成不轉義的形式 Console.WriteLine(Uri.FromHex('A')); //輸出 10 獲取16進制數字的十進制值 Console.WriteLine(Uri.HexEscape('2')); //輸出 %32 轉換它的等效十六進制字符。 Console.WriteLine(Uri.IsHexDigit('F')); //輸出True 確定指定的字符是否為有效的十六進制數字。 int index = 0; if (Uri.IsHexEncoding("%75", index)) Console.WriteLine("該編碼代表的字符是 :{0}", Uri.HexUnescape("%75", ref index)); else Console.WriteLine("這不是16禁止編碼"); //以下兩個實例方法GetLeftPart與GetComponents都用於獲取Uri中的一部分,可以是端口,方案,參數等等。 Console.WriteLine(uri.GetComponents(UriComponents.Scheme,UriFormat.Unescaped)); //輸出 http 獲取Uri中的一部分,兩個參數都是枚舉 Console.WriteLine(uri.GetLeftPart(UriPartial.Scheme)); //輸出 http:// Uri uri1 = new Uri("Http://www.baidu.com"); Console.WriteLine(uri.IsBaseOf(uri1)); //輸出 False Console.WriteLine(uri1.IsBaseOf(uri)); //輸出 True //TryCreate也可用於相對路徑轉絕對路徑,返回一個新的uri並且不成功時不報異常 Uri uri2 = new Uri("http://www.baidu.com/a/b/c.html"); Uri uri3; Uri.TryCreate(uri2,"../123.html",out uri3); Console.WriteLine(uri3); //輸出 http://www.baidu.com/a/123.html Uri uri4 = uri2.MakeRelativeUri(uri3); Console.WriteLine(uri4); //輸出..123/html //再來一個 Uri uri5 = new Uri("http://www.baidu.com/a/b/d.html"); Uri uri6 = new Uri("http://www.baidu.com/a/b/c.html"); Uri uri7 = uri5.MakeRelativeUri(uri6); Console.WriteLine(uri7); //輸出 c.html //這樣就表示目錄相同,文件名不同,相對於第一個調用Uri來說的 //確定文件是否不需要轉義,沒特殊字符就不需要轉移 //以下兩個方法基本一致,只是一個是靜態方法,一個是實例方法而已 Console.WriteLine(Uri.IsWellFormedUriString("http://www.baidu.com", UriKind.Absolute)); //輸出 True UriKind是一個枚舉 Console.WriteLine(Uri.IsWellFormedUriString("http://www.baidu.com/123.html?名字=張三", UriKind.Absolute)); //輸出 False 表示需要轉義 Console.WriteLine(uri.IsWellFormedOriginalString()); //True 此 Uri 的字符串是否格式良好,以及它是否不需要進一步轉義。 Uri uri8 = new Uri("http://www.baidu.com/123.html?名字=張三"); Console.WriteLine(uri8.IsWellFormedOriginalString()); //輸出False Console.ReadKey(); } }
有時間要看好點,這個類還是很有用的。
另附上一個常用的功能,相對Uri轉絕對Uri,這是是利用構造函數實現的,傳入一個baseUri就能夠實現,如如下代碼:
static void Main(string[] args) { Uri uri = new Uri("http://www.jmeii.com/a/b/index.html"); Uri uri2 = new Uri(uri,"../123.html"); Console.WriteLine(uri2.ToString()); //輸出http://www.jmeii.com/a/123.html Console.ReadKey(); }