本篇文章来分享一下c#的uricomponents枚举,uricomponents是c#中的一个枚举类型,位于system命名空间下,用于指定从uri对象中提取哪些部分的信息,常见于处理统一资源标识符(uri),例如在进行网络编程、url解析等场景中。
1.uricomponents枚举的常用成员
枚举成员 | 含义描述 | 适用场景 |
serializationinfostring | 内部用于uri序列化的标记,外部调用无实际意义(值为int.minvalue)。 | 框架内部序列化逻辑,开发者无需使用。 |
scheme | 提取uri的协议部分(如http、https、ftp)。 | 1.判断请求协议类型(如是否为加密的https); 2.根据协议选择不同的处理逻辑(如ftp需登录)。 |
userinfo | 提取uri中的用户认证信息(格式:用户名:密码,如user:password)。 | 1.解析包含身份认证的旧版uri; 2.日志记录中提取认证信息(需注意安全风险)。 |
host | 提取主机名或ip地址(如example.com、192.168.1.1),不含端口。 | 1.验证服务器域名(如白名单校验);2.统计访问的主机分布。 |
port | 提取端口号(如8080),默认端口(如https的443)返回-1。 | 1.检查是否使用非默认端口(如8080需特殊处理); 2.构建网络连接时指定端口。 |
schemeandserver | 组合值,提取协议+用户信息+主机+端口(如https://user@example.com:8080)。 | 1.获取服务的基础访问地址(如拼接新路径); 2.跨域请求时验证服务器标识。 |
path | 提取资源路径(如/api/users),不含查询参数或片段。 | 1.解析api路由(如/api/users对应用户模块); 2.验证请求路径的合法性(防止越权)。 |
query | 提取查询字符串(如id=123&name=test),不含?分隔符。 | 1.解析url中的请求参数(如分页、筛选条件); 2.日志记录或分析用户请求参数。 |
pathandquery | 组合值,提取路径+查询字符串(如/api/users?id=123)。 | 1.构建带参数的资源路径; 2.比较两个请求的路径和参数是否一致。 |
httprequesturl | 组合值,提取http请求完整路径(不含片段,如https://example.com/api?id=1)。 | 1.生成http请求的目标url; 2.记录完整的请求地址(不含页面内锚点)。 |
fragment | 提取片段标识符(如section1),即#后的内容(不含#)。 | 1.网页内锚点定位(如滚动到#chapter2章节); 2.单页应用(spa)的路由跳转。 |
absoluteuri | 组合值,提取完整uri(包含所有部分)。 | 1.完整复制或记录uri; 2.对uri进行整体格式化或编码转换。 |
strongport | 强制返回实际端口号(即使是默认端口,如https会返回443,而非-1)。 | 1.需要显式展示默认端口的场景(如文档生成); 2.端口相关的精确校验逻辑。 |
hostandport | 组合值,提取主机+显式端口(如example.com:443,含默认端口)。 | 1.展示服务器的主机和端口信息(强制显式端口); 2.比较两个uri的主机和端口是否一致。 |
strongauthority | 组合值,提取用户信息+主机+显式端口(如user:pass@example.com:443)。 | 1.需完整展示认证信息+主机端口的场景; 2.旧版系统的身份验证相关逻辑。 |
normalizedhost | 提取标准化主机名(如大写转小写example.com→example.com,处理国际化域名)。 | 1.域名比较(忽略大小写差异); 2.处理国际化域名(如中文域名的punycode转换)。 |
keepdelimiter | 保留分隔符(如?、#),需与其他成员组合使用(如querykeepdelimiter返回?id=123)。 | 1.需要保留原始分隔符的场景(如url格式化展示); 2.生成带分隔符的查询字符串或片段。 |
2.使用示例
以"https://user:password@example.com:8080/api/users?id=123#section1"为例,是一个完整的uri(统一资源标识符),首先来了解一下各部分含义:
了解完整的uri
组成部分 | 示例值 | 说明 |
协议(scheme) | https | 通信协议,https表示加密的http协议(默认端口443)。 |
用户信息 | user:password | 登录认证信息(格式:用户名:密码),现代应用中较少使用(不安全)。 |
主机名(host) | example.com | 服务器域名或ip地址,标识资源所在的服务器。 |
端口(port) | 8080 | 服务器端口号,此处为非默认端口(默认端口可省略,如https默认443)。 |
路径(path) | /api/users | 资源在服务器上的路径,通常对应后端接口或文件位置。 |
查询字符串 | id=123 | 附加参数(格式:key=value&key2=value2),用于筛选或配置资源。 |
片段(fragment) | section1 | 页面内锚点,用于定位页面中的具体位置(如网页中的章节)。 |
测试代码
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;//不转义特殊字符
//1. serializationinfostring:内部序列化使用(外部调用无实际意义)
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:提取协议部分
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:提取主机名
string host = uri.getcomponents(uricomponents.host, format);
debug.log($"host: {host}");
//输出:host: example.com
//5. port:提取端口号(默认端口返回-1)
string port = uri.getcomponents(uricomponents.port, format);
debug.log($"port: {port}");
//输出:port: 8080
//6. schemeandserver:协议+用户信息+主机+端口(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请求完整路径(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:提取片段(锚点,不含#)
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:强制返回实际端口(包括默认端口)
string strongport = uri.getcomponents(uricomponents.strongport, format);
debug.log($"strongport: {strongport}");
//输出:strongport: 8080
//14. hostandport:主机+显式端口(4|8|128=132)
string hostandport = uri.getcomponents(uricomponents.hostandport, format);
debug.log($"hostandport: {hostandport}");
//输出:hostandport: example.com:8080
//15. strongauthority:用户信息+主机+显式端口(2|132=134)
string strongauthority = uri.getcomponents(uricomponents.strongauthority, format);
debug.log($"strongauthority: {strongauthority}");
//输出:strongauthority: user:password@example.com:8080
//16. normalizedhost:标准化主机名(小写+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
}
}
结果

3.总结
uricomponents枚举的核心价值是精确提取uri的特定部分,避免手动切割字符串可能导致的错误(如特殊字符处理、格式差异)。在网络请求、url解析、路由处理等场景中,使用它能让代码更简洁、可靠。
到此这篇关于c#中uricomponents枚举的实现示例的文章就介绍到这了,更多相关c# uricomponents枚举内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论