System.Uri 类
方法描述
提供统一资源标识符 (URI) 的对象表示形式和对 URI 各部分的轻松访问。
语法定义(C# System.Uri 类 的用法)
[SerializableAttribute] [TypeConverterAttribute(typeof(UriTypeConverter))] public class Uri : ISerializable
构造函数
构造函数名称 | 构造函数描述 |
---|---|
Uri(String) | 用指定 URI 初始化 Uri 类的新实例。 |
Uri(SerializationInfo, StreamingContext) | 从 SerializationInfo 和 StreamingContext 类的指定实例初始化 Uri 类的新实例。 |
Uri(String, Boolean) | 已过时。用指定的 URI 初始化 Uri 类的新实例,并对字符转义进行显式控制。 |
Uri(String, UriKind) | 用指定 URI 初始化 Uri 类的新实例。 此构造函数允许您指定 URI 字符串是相对 URI、绝对 URI 还是不确定。 |
Uri(Uri, String) | 根据指定的基 URI 和相对 URI 字符串,初始化 Uri 类的新实例。 |
Uri(Uri, Uri) | 根据指定的基 Uri 实例和相对 Uri 实例的组合,初始化 Uri 类的新实例。 |
Uri(Uri, String, Boolean) | 已过时。根据指定的基 URI 和相对 URI,初始化 Uri 类的新实例,并对字符转义进行显式控制。 |
成员/方法
方法名称 | 方法描述 |
---|---|
Canonicalize | 基础结构。 已过时。将内部存储的 URI 转换为规范化格式。 |
CheckHostName | 确定指定的主机名是否为有效的 DNS 名称。 |
CheckSchemeName | 确定指定的方案名是否有效。 |
CheckSecurity | 基础结构。 已过时。调用此方法不起任何作用。 |
Compare | 使用指定的比较规则比较两个 URI 的指定部分。 |
Equals | 比较两个 Uri 实例是否相等。 (重写 Object.Equals(Object)。) |
Escape | 基础结构。 已过时。将路径部分中的任何不安全字符或保留字符转换为对应的十六进制字符表示形式。 |
EscapeDataString | 将字符串转换为它的转义表示形式。 |
EscapeString | 已过时。将字符串转换为它的转义表示形式。 |
EscapeUriString | 将 URI 字符串转换为它的转义表示形式。 |
Finalize | 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。) |
FromHex | 获取十六进制数字的十进制值。 |
GetComponents | 使用特殊字符的指定转义,获取当前实例的指定部分。 |
GetHashCode | 获取 URI 的哈希代码。 (重写 Object.GetHashCode()。) |
GetLeftPart | 获取 Uri 实例的指定部分。 |
GetObjectData | 返回序列化当前实例所需的数据。 |
GetType | 获取当前实例的 Type。 (继承自 Object。) |
HexEscape | 将指定的字符转换它的等效十六进制字符。 |
HexUnescape | 将字符的指定十六进制表示形式转换为字符。 |
IsBadFileSystemCharacter | 基础结构。 已过时。获取一个值,该值指示字符是否在文件系统名称中无效。 |
IsBaseOf | 确定当前的 Uri 实例是否为指定 Uri 实例的基。 |
IsExcludedCharacter | 基础结构。 已过时。获取一个值,该值指示是否应该转义指定的字符。 |
IsHexDigit | 确定指定的字符是否为有效的十六进制数字。 |
IsHexEncoding | 确定字符串中的一个字符是否为十六进制编码。 |
IsReservedCharacter | 基础结构。 已过时。获取一个值,该值指示指定的字符是否为保留字符。 |
IsWellFormedOriginalString | 指示用于构造此 Uri 的字符串是否格式良好,以及它是否不需要进一步转义。 |
IsWellFormedUriString | 通过尝试用字符串构造一个 URI 来指示字符串是否为格式良好的,并确保字符串不需要进一步转义。 |
MakeRelative | 已过时。确定两个 Uri 实例之间的差异。 |
MakeRelativeUri | 确定两个 Uri 实例之间的差异。 |
MemberwiseClone | 创建当前 Object 的浅表副本。 (继承自 Object。) |
Parse | 基础结构。 已过时。分析当前实例的 URI 以确保它包含有效 URI 所需的所有部分。 |
ToString | 获取指定的 Uri 实例的规范化字符串表示形式。 (重写 Object.ToString()。) |
TryCreate(String, UriKind, Uri) | 使用指定的 String 实例和 UriKind 创建一个新的 Uri。 |
TryCreate(Uri, String, Uri) | 使用指定的基和相对 String 实例创建一个新的 Uri。 |
TryCreate(Uri, Uri, Uri) | 使用指定基和相对 Uri 实例创建一个新的 Uri。 |
Unescape | 基础结构。 已过时。转换指定的字符串,方法是将任何转义序列替换为相应的未转义表示形式。 |
UnescapeDataString | 将字符串转换为它的非转义表示形式。 |
提示和注释
URI 是 Intranet 或 Internet 上可由应用程序使用的资源的一种简洁表示形式。 Uri 类定义了属性和方法来处理 URI,包括分析、比较和组合。 Uri 类属性是只读的;若要创建可修改的对象,请使用 UriBuilder 类。
相对 URI(例如“/new/index.htm”)必须相对于基 URI 展开,这样才是绝对的。 提供了 MakeRelative 方法在必要时将绝对 URI 转换为相对 URI。
如果 URI 字符串是格式良好的 URI 并且包括方案标识符,Uri 构造函数将不会转义 URI 字符串。
Uri 属性用转义编码返回规范化数据表示形式,任何 Unicode 值大于 127 的字符都会被替换为等效的十六进制数。 为使 URI 具有规范化格式,Uri 构造函数执行以下步骤:
将 URI 方案转换为小写。
将主机名转换为小写。
如果主机名为 IPv6 地址,则使用规范化 IPv6 地址。 ScopeId 和其他可选的 IPv6 数据将被移除。
移除默认端口号和空端口号。
通过压缩 /./、/../、// 等序列(包括转义表示形式),规范化分层 URI 的路径。 请注意,在某些方案中,不压缩转义表示形式。
对于分层 URI,如果主机未以正斜杠 (/) 结尾,则添加一个正斜杠。
默认情况下,URI 中的任何保留字符都要根据 RFC 2396 进行转义。 如果启用了国际资源标识符或国际域名分析,则会按照 RFC 3986 和 RFC 3987 对 URI 中的保留字符进行转义,因此该行为会发生变化。
在某些方案的构造函数中,作为规范化工作的一部分,将压缩转义表示形式。 其 URI 将压缩转义序列的方案包括:file、http、https、net.pipe 和 net.tcp。 对于所有方案,转义序列不能压缩。 例如:如果您将两个点".."编码为百分号形式的"%2E%2E",则对于某些方案,URI 构造函数将压缩此序列。 例如,下面的代码示例演示 http 方案的 URI 构造函数。
复制
Uri uri = new Uri("http://myUrl/%2E%2E/%2E%2E");
Console.WriteLine(uri.AbsoluteUri);
Console.WriteLine(uri.PathAndQuery);
当这段代码执行时,将返回下面的输出,其中对转义序列进行了压缩。
复制
http://myUrl/
/
下面的代码示例演示 ftp 方案的 URI 构造函数:
复制
Uri uri = new Uri("ftp://myUrl/%2E%2E/%2E%2E");
Console.WriteLine(uri.AbsoluteUri);
Console.WriteLine(uri.PathAndQuery);
当这段代码执行时,将返回下面的输出,其中未对转义序列进行压缩。
复制
ftp://myUrl/%2E%2E/%2E%2E
/%2E%2E/%2E%2E
使用 ToString 方法,可以将 Uri 类的内容从转义编码的 URI 引用转换为可读的 URI 引用。 请注意,在 ToString 方法的输出中,某些保留字符可能仍会被转义。 这是为了支持利用 ToString 返回的值明确无误地重新构造 URI。
某些 URI 会包括一个片段标识符或一个查询,或同时包含这两项内容。 片段标识符是跟在数字符号 (#) 之后的任意文本(不包括数字符号本身);段落文本储存在 Fragment 属性中。 查询信息是在 URI 中一个问号 (?) 后面的任何文本;查询文本存储在 Query 属性中。
在 .NET Framework 1.1 版中,如果指定给构造函数的字符串包含未知的方案和“c:\”,则 URI 类会在冒号后面插入“//”。 例如,URI xyz:c:\abc 会转换为 xyz://c:/abc。 在 .NET Framework 2.0 版中已经移除这一行为,示例字符串会转换为 xyz:c:/abc。
注意
URI 类支持使用以下格式的 IP 地址:四组表示法的 IPv4 协议和冒号分隔的十六进制 IPv6 协议。 请记住在 IPv6 地址两边括上方括号,如 http://[::1]。
国际资源标识符支持
Web 地址通常使用统一资源标识符表示,该标识符由一组严格限制的字符组成:
英语字母表中的大写和小写 ASCII 字母。
数字 0 到 9。
少量其他 ASCII 符号。
Internet 工程任务组 (IETF) 发布的 RFC 2396、RFC 2732、RFC 3986和 RFC 3987 中说明了 URI 规范。
随着 Internet 的发展,越来越需要使用除英语以外的其他语言来标识资源。 能够满足这一需要并允许使用非 ASCII 字符(Unicode/ISO 10646 字符集中的字符)的标识符称为国际资源标识符 (IRI)。 IETF 发布的 RFC 3987 中对 IRI 规范进行了说明。 使用 IRI 可以在 URL 中包含 Unicode 字符。
现有的 Uri 类在 .NET Framework v3.5、3.0 SP1 和 2.0 SP1 中已被扩展,以提供基于 RFC 3987 的 IRI 支持。 除非特地启用了 IRI,否则当前用户不会看到 .NET Framework 2.0 的行为发生任何变化。 这确保了应用程序与以前版本的 .NET Framework 的兼容性。
若要启用对 IRI 的支持,必须进行以下更改:
指定是否将国际化域名 (IDN) 语法分析应用于域名,以及是否需应用 IRI 语法分析规则。 这可以在 machine.config 或 app.config 文件中完成。 例如,请添加以下内容:
复制
启用 IDN 会将域名中的所有 Unicode 标签转换为它们的 Punycode 等效项。 Punycode 名称仅包含 ASCII 字符,并且总是以 xn-- 前缀开头。 这样做是为了支持 Internet 中现有的 DNS 服务器,因为大多数 DNS 服务器仅支持 ASCII 字符(请参见 RFC 3940)。
启用 IRI 和 IDN 会影响 Uri.DnsSafeHost 属性的值。 启用 IRI 和 IDN 还可能更改 Equals、OriginalString、GetComponents 和 IsWellFormedOriginalString 方法的行为。
IDN 有三个可能的值,具体取决于所使用的 DNS 服务器:
idn enabled = All
此值会将所有 Unicode 域名转换为它们的 Punycode 等效项(IDN 名称)。
idn enabled = AllExceptIntranet
此值会将所有不在本地 Intranet 中的 Unicode 域名转换为使用 Punycode 等效项(IDN 名称)。 在这种情况下,若要处理本地 Intranet 上的国际化名称,用于 Intranet 的 DNS 服务器应该支持 Unicode 名称解析。
idn enabled = None
此值不会将任何 Unicode 域名转换为使用 Punycode。 这是与 .NET Framework 2.0 行为一致的默认值。
启用 IRI 分析 (iriParsing enabled = true) 将执行正则化,并根据 RFC 3986 和 RFC 3987 中最新的 IRI 规则检查字符。 默认值为 false,此时将根据 RFC 2396 和 RFC 2732(针对 IPv6 文本)执行规范化和字符检查。
还可以使用 System.Configuration.IriParsingElement、System.Configuration.IdnElement 和 System.Configuration.UriSection 配置设置类来控制 Uri 类中的 IRI 和 IDN 处理。 System.Configuration.IriParsingElement 设置可以启用或禁用 Uri 类中的 IRI 处理。 System.Configuration.IdnElement 设置可以启用或禁用 Uri 类中的 IDN 处理。 System.Configuration.IriParsingElement 设置还可以间接控制 IDN。 若要进行 IDN 处理,必须启用 IRI 处理。 如果禁用了 IRI 处理,则 IDN 处理将设置为默认设置,在此情况下,将使用 .NET Framework 2.0 行为以确保兼容且不使用 IDN 名称。
在构造第一个 System.Uri 类时,将读取 System.Configuration.IriParsingElement 和 System.Configuration.IdnElement 的配置设置一次。 之后进行的配置设置更改将被忽略。
System.GenericUriParser 类也已经进行了扩展,以便创建支持 IRI 和 IDN 的可自定义的分析器。 通过向 System.GenericUriParser 构造函数传递 System.GenericUriParserOptions 枚举中提供的值的按位组合,可以指定 System.GenericUriParser 对象的行为。 GenericUriParserOptions.IriParsing 类型指示分析器支持 RFC 3987 中指定的国际资源标识符 (IRI) 语法分析规则。 是否使用 IRI 由前面讨论的配置值指定。
GenericUriParserOptions.Idn 类型指示分析器支持对主机名进行国际化域名 (IDN) 语法分析。 是否使用 IDN 由前面讨论的配置值指定。
性能注意事项
使用包含 URI 的 Web.config 文件来初始化应用程序时,如果 URI 的方案标识符是非标准的,则需要额外的时间来处理 URI。 在这种情况下,请在需要 URI 的时候(而非启动时)初始化应用程序的受影响部分。
对调用者的说明
出于安全方面的考虑,如果您的应用程序接受来自不受信任来源的 Uri 实例并且 dontEscape 设置为 true,则使用时应谨慎。您可以通过调用 IsWellFormedOriginalString 方法来检查 URI 字符串是否有效。
System.Uri 类例子
下面的示例创建 Uri 类的实例,并用它来创建 WebRequest 实例。
Uri siteUri = new Uri("http://www.contoso.com/"); WebRequest wr = WebRequest.Create(siteUri);
线程安全
此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。
版本信息
.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:
适用平台
Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。
相关资源
- System 命名空间
- System.Configuration.IdnElement
- System.Configuration.IriParsingElement
- System.Configuration.UriSection
- DnsSafeHost
- MakeRelative
- IsWellFormedOriginalString
- UriBuilder
- Changes to the System.Uri namespace in Version 2.0
- International Resource Identifier Support in System.Uri
- Network Programming
- MSDN
- System.Configuration.IdnElement