System.Uri類 - 獲取Url的各種屬性,文件名,參數,域名,端口等等


  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();
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM