C#中UriComponents枚舉的實(shí)現(xiàn)示例
本篇文章來分享一下C#的UriComponents枚舉,UriComponents是C#中的一個(gè)枚舉類型,位于System命名空間下,用于指定從Uri對(duì)象中提取哪些部分的信息,常見于處理統(tǒng)一資源標(biāo)識(shí)符(URI),例如在進(jìn)行網(wǎng)絡(luò)編程、URL解析等場(chǎng)景中。
1.UriComponents枚舉的常用成員
枚舉成員 | 含義描述 | 適用場(chǎng)景 |
SerializationInfoString | 內(nèi)部用于URI序列化的標(biāo)記,外部調(diào)用無實(shí)際意義(值為int.MinValue)。 | 框架內(nèi)部序列化邏輯,開發(fā)者無需使用。 |
Scheme | 提取URI的協(xié)議部分(如http、https、ftp)。 | 1.判斷請(qǐng)求協(xié)議類型(如是否為加密的https); 2.根據(jù)協(xié)議選擇不同的處理邏輯(如ftp需登錄)。 |
UserInfo | 提取URI中的用戶認(rèn)證信息(格式:用戶名:密碼,如user:password)。 | 1.解析包含身份認(rèn)證的舊版URI; 2.日志記錄中提取認(rèn)證信息(需注意安全風(fēng)險(xiǎn))。 |
Host | 提取主機(jī)名或IP地址(如example.com、192.168.1.1),不含端口。 | 1.驗(yàn)證服務(wù)器域名(如白名單校驗(yàn));2.統(tǒng)計(jì)訪問的主機(jī)分布。 |
Port | 提取端口號(hào)(如8080),默認(rèn)端口(如https的443)返回-1。 | 1.檢查是否使用非默認(rèn)端口(如8080需特殊處理); 2.構(gòu)建網(wǎng)絡(luò)連接時(shí)指定端口。 |
SchemeAndServer | 組合值,提取協(xié)議+用戶信息+主機(jī)+端口(如https://user@example.com:8080)。 | 1.獲取服務(wù)的基礎(chǔ)訪問地址(如拼接新路徑); 2.跨域請(qǐng)求時(shí)驗(yàn)證服務(wù)器標(biāo)識(shí)。 |
Path | 提取資源路徑(如/api/users),不含查詢參數(shù)或片段。 | 1.解析API路由(如/api/users對(duì)應(yīng)用戶模塊); 2.驗(yàn)證請(qǐng)求路徑的合法性(防止越權(quán))。 |
Query | 提取查詢字符串(如id=123&name=test),不含?分隔符。 | 1.解析URL中的請(qǐng)求參數(shù)(如分頁、篩選條件); 2.日志記錄或分析用戶請(qǐng)求參數(shù)。 |
PathAndQuery | 組合值,提取路徑+查詢字符串(如/api/users?id=123)。 | 1.構(gòu)建帶參數(shù)的資源路徑; 2.比較兩個(gè)請(qǐng)求的路徑和參數(shù)是否一致。 |
HttpRequestUrl | 組合值,提取HTTP請(qǐng)求完整路徑(不含片段,如https://example.com/api?id=1)。 | 1.生成HTTP請(qǐng)求的目標(biāo)URL; 2.記錄完整的請(qǐng)求地址(不含頁面內(nèi)錨點(diǎn))。 |
Fragment | 提取片段標(biāo)識(shí)符(如section1),即#后的內(nèi)容(不含#)。 | 1.網(wǎng)頁內(nèi)錨點(diǎn)定位(如滾動(dòng)到#chapter2章節(jié)); 2.單頁應(yīng)用(SPA)的路由跳轉(zhuǎn)。 |
AbsoluteUri | 組合值,提取完整URI(包含所有部分)。 | 1.完整復(fù)制或記錄URI; 2.對(duì)URI進(jìn)行整體格式化或編碼轉(zhuǎn)換。 |
StrongPort | 強(qiáng)制返回實(shí)際端口號(hào)(即使是默認(rèn)端口,如https會(huì)返回443,而非-1)。 | 1.需要顯式展示默認(rèn)端口的場(chǎng)景(如文檔生成); 2.端口相關(guān)的精確校驗(yàn)邏輯。 |
HostAndPort | 組合值,提取主機(jī)+顯式端口(如example.com:443,含默認(rèn)端口)。 | 1.展示服務(wù)器的主機(jī)和端口信息(強(qiáng)制顯式端口); 2.比較兩個(gè)URI的主機(jī)和端口是否一致。 |
StrongAuthority | 組合值,提取用戶信息+主機(jī)+顯式端口(如user:pass@example.com:443)。 | 1.需完整展示認(rèn)證信息+主機(jī)端口的場(chǎng)景; 2.舊版系統(tǒng)的身份驗(yàn)證相關(guān)邏輯。 |
NormalizedHost | 提取標(biāo)準(zhǔn)化主機(jī)名(如大寫轉(zhuǎn)小寫EXAMPLE.COM→example.com,處理國際化域名)。 | 1.域名比較(忽略大小寫差異); 2.處理國際化域名(如中文域名的Punycode轉(zhuǎn)換)。 |
KeepDelimiter | 保留分隔符(如?、#),需與其他成員組合使用(如QueryKeepDelimiter返回?id=123)。 | 1.需要保留原始分隔符的場(chǎng)景(如URL格式化展示); 2.生成帶分隔符的查詢字符串或片段。 |
2.使用示例
以"https://user:password@example.com:8080/api/users?id=123#section1"為例,是一個(gè)完整的URI(統(tǒng)一資源標(biāo)識(shí)符),首先來了解一下各部分含義:
了解完整的URI
組成部分 | 示例值 | 說明 |
協(xié)議(Scheme) | https | 通信協(xié)議,https表示加密的HTTP協(xié)議(默認(rèn)端口443)。 |
用戶信息 | user:password | 登錄認(rèn)證信息(格式:用戶名:密碼),現(xiàn)代應(yīng)用中較少使用(不安全)。 |
主機(jī)名(Host) | example.com | 服務(wù)器域名或IP地址,標(biāo)識(shí)資源所在的服務(wù)器。 |
端口(Port) | 8080 | 服務(wù)器端口號(hào),此處為非默認(rèn)端口(默認(rèn)端口可省略,如https默認(rèn)443)。 |
路徑(Path) | /api/users | 資源在服務(wù)器上的路徑,通常對(duì)應(yīng)后端接口或文件位置。 |
查詢字符串 | id=123 | 附加參數(shù)(格式:key=value&key2=value2),用于篩選或配置資源。 |
片段(Fragment) | section1 | 頁面內(nèi)錨點(diǎn),用于定位頁面中的具體位置(如網(wǎng)頁中的章節(jié))。 |
測(cè)試代碼
using System;
using UnityEngine;
public class UriComponentsTest : MonoBehaviour
{
private void Start()
{
string uriString = "https://user:password@example.com:8080/api/users?id=123#section1";
Uri uri = new Uri(uriString);
UriFormat format = UriFormat.Unescaped;//不轉(zhuǎn)義特殊字符
//1. SerializationInfoString:內(nèi)部序列化使用(外部調(diào)用無實(shí)際意義)
string serializationInfo = uri.GetComponents(UriComponents.SerializationInfoString, format);
Debug.Log($"SerializationInfoString: {serializationInfo}");
//輸出:SerializationInfoString: https://user:password@example.com:8080/api/users?id=123#section1
//2. Scheme:提取協(xié)議部分
string scheme = uri.GetComponents(UriComponents.Scheme, format);
Debug.Log($"Scheme: {scheme}");
//輸出:Scheme: https
//3. UserInfo:提取用戶信息(用戶名:密碼)
string userInfo = uri.GetComponents(UriComponents.UserInfo, format);
Debug.Log($"UserInfo: {userInfo}");
//輸出:UserInfo: user:password
//4. Host:提取主機(jī)名
string host = uri.GetComponents(UriComponents.Host, format);
Debug.Log($"Host: {host}");
//輸出:Host: example.com
//5. Port:提取端口號(hào)(默認(rèn)端口返回-1)
string port = uri.GetComponents(UriComponents.Port, format);
Debug.Log($"Port: {port}");
//輸出:Port: 8080
//6. SchemeAndServer:協(xié)議+用戶信息+主機(jī)+端口(1|2|4|8=13)
string schemeAndServer = uri.GetComponents(UriComponents.SchemeAndServer, format);
Debug.Log($"SchemeAndServer: {schemeAndServer}");
//輸出:SchemeAndServer: https://user:password@example.com:8080
//7. Path:提取路徑部分
string path = uri.GetComponents(UriComponents.Path, format);
Debug.Log($"Path: {path}");
//輸出:Path: /api/users
//8. Query:提取查詢字符串(不含?)
string query = uri.GetComponents(UriComponents.Query, format);
Debug.Log($"Query: {query}");
//輸出:Query: id=123
//9. PathAndQuery:路徑+查詢字符串(16|32=48)
string pathAndQuery = uri.GetComponents(UriComponents.PathAndQuery, format);
Debug.Log($"PathAndQuery: {pathAndQuery}");
//輸出:PathAndQuery: /api/users?id=123
//10. HttpRequestUrl:HTTP請(qǐng)求完整路徑(13|48=61)
string httpRequestUrl = uri.GetComponents(UriComponents.HttpRequestUrl, format);
Debug.Log($"HttpRequestUrl: {httpRequestUrl}");
//輸出:HttpRequestUrl: https://user:password@example.com:8080/api/users?id=123
//11. Fragment:提取片段(錨點(diǎn),不含#)
string fragment = uri.GetComponents(UriComponents.Fragment, format);
Debug.Log($"Fragment: {fragment}");
//輸出:Fragment: section1
//12. AbsoluteUri:完整URI(13|48|64=127)
string absoluteUri = uri.GetComponents(UriComponents.AbsoluteUri, format);
Debug.Log($"AbsoluteUri: {absoluteUri}");
//輸出:AbsoluteUri: https://user:password@example.com:8080/api/users?id=123#section1
//13. StrongPort:強(qiáng)制返回實(shí)際端口(包括默認(rèn)端口)
string strongPort = uri.GetComponents(UriComponents.StrongPort, format);
Debug.Log($"StrongPort: {strongPort}");
//輸出:StrongPort: 8080
//14. HostAndPort:主機(jī)+顯式端口(4|8|128=132)
string hostAndPort = uri.GetComponents(UriComponents.HostAndPort, format);
Debug.Log($"HostAndPort: {hostAndPort}");
//輸出:HostAndPort: example.com:8080
//15. StrongAuthority:用戶信息+主機(jī)+顯式端口(2|132=134)
string strongAuthority = uri.GetComponents(UriComponents.StrongAuthority, format);
Debug.Log($"StrongAuthority: {strongAuthority}");
//輸出:StrongAuthority: user:password@example.com:8080
//16. NormalizedHost:標(biāo)準(zhǔn)化主機(jī)名(小寫+IDN處理)
string normalizedHost = uri.GetComponents(UriComponents.NormalizedHost, format);
Debug.Log($"NormalizedHost: {normalizedHost}");
//輸出:NormalizedHost: example.com
//17. KeepDelimiter:保留?分隔符(需與其他成員組合)
string queryWithDelimiter = uri.GetComponents(UriComponents.Query | UriComponents.KeepDelimiter, format);
Debug.Log($"Query | KeepDelimiter: {queryWithDelimiter}");
//輸出:Query | KeepDelimiter: ?id=123
}
}
結(jié)果

3.總結(jié)
UriComponents枚舉的核心價(jià)值是精確提取URI的特定部分,避免手動(dòng)切割字符串可能導(dǎo)致的錯(cuò)誤(如特殊字符處理、格式差異)。在網(wǎng)絡(luò)請(qǐng)求、URL解析、路由處理等場(chǎng)景中,使用它能讓代碼更簡(jiǎn)潔、可靠。
到此這篇關(guān)于C#中UriComponents枚舉的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# UriComponents枚舉內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用WebClient登錄網(wǎng)站并抓取登錄后的網(wǎng)頁信息實(shí)現(xiàn)方法
這篇文章主要介紹了C#使用WebClient登錄網(wǎng)站并抓取登錄后的網(wǎng)頁信息實(shí)現(xiàn)方法,涉及C#基于會(huì)話操作登陸網(wǎng)頁及頁面讀取相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
C#獲取兩個(gè)時(shí)間的時(shí)間差并去除周末(取工作日)的方法
這篇文章主要介紹了C#獲取兩個(gè)時(shí)間的時(shí)間差并去除周末(取工作日)的方法,可有效的實(shí)現(xiàn)獲取工作日的功能,涉及C#時(shí)間操作的相關(guān)技巧,需要的朋友可以參考下2015-05-05
C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放
這篇文章主要介紹了C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放,涉及C#采用Dispose模式操作資源的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
C#?Stopwatch實(shí)現(xiàn)計(jì)算代碼運(yùn)行時(shí)間
這篇文章主要為大家詳細(xì)介紹了C#如何使用Stopwatch實(shí)現(xiàn)計(jì)算代碼運(yùn)行時(shí)間,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
基于WPF平臺(tái)使用純C#制作流體動(dòng)畫的代碼示例
在 WPF 應(yīng)用開發(fā)中,為界面添加生動(dòng)的動(dòng)畫效果能顯著提升用戶體驗(yàn),通常,我們會(huì)結(jié)合 XAML 和 C# 來打造各種動(dòng)畫,但今天我們聚焦于如何僅用純 C# 在 WPF 平臺(tái)上制作出令人驚艷的流體動(dòng)畫,感興趣的小伙伴跟著小編一起來看看吧2025-01-01
使用C#代碼驗(yàn)證和獲取PDF中的數(shù)字簽名
使用數(shù)字簽名保護(hù) PDF 對(duì)于確保文檔的完整性和不可否認(rèn)性至關(guān)重要,在此背景下,能夠驗(yàn)證數(shù)字簽名同樣重要,本文將向您介紹如何在 C# 中使用 Spire.PDF for .NET 驗(yàn)證或獲取 PDF 中的數(shù)字簽名,需要的朋友可以參考下2025-11-11
C#實(shí)現(xiàn)導(dǎo)入CSV文件到Excel工作簿的方法
這篇文章主要介紹了C#實(shí)現(xiàn)導(dǎo)入CSV文件到Excel工作簿的方法,涉及C#針對(duì)office組件的相關(guān)操作技巧,需要的朋友可以參考下2015-06-06

