.NET Framework 4.7.2中UriBuilder的Port属性行为不符文档?
疑问:UriBuilder.Port返回默认端口而非-1的问题
根据官方文档描述:
端口号定义了联系URI中引用主机的协议端口。如果URI中未指定端口,Port属性应返回-1,表示将使用协议方案的默认端口连接主机。若将Port属性设为-1,同样表示使用默认端口。
我使用VB代码进行测试(代码如下):
Public Sub Main() dim logonLink as string = "https://website/application/login.aspx" Console.WriteLine("RETURN: {0}", logonLink) Dim uriBuilder As New UriBuilder(logonLink) Console.WriteLine("HOST: {0}", uriBuilder.Host) Console.WriteLine("PORT: {0}", uriBuilder.Port) End Sub
但运行时发现,当链接为http时Port返回80,https时返回443,与预期的-1不符,环境为.NET Framework 4.7.2。另外,Uri类同样返回默认端口,但至少提供了IsDefaultPort属性:
Dim uri As Uri = nothing Uri.TryCreate(logonLink, UriKind.Absolute, uri) Console.WriteLine("URI PORT: {0}", uri.Port) Console.WriteLine("URI PORT def: {0}", uri.IsDefaultPort)
请问我是否忽略了什么?
解答
这是.NET Framework中UriBuilder类的设计行为差异,官方文档的描述存在表述模糊:
- 当通过字符串初始化
UriBuilder时,它会自动解析URI并将对应协议的默认端口(http=80、https=443)赋值给Port属性,不会返回-1。只有手动将Port设为-1时,它才会启用默认端口逻辑,生成的URI字符串也不会显式携带端口,但读取Port属性仍会得到默认端口数值。 - 文档中“返回-1”的描述更偏向逻辑语义,而非实际运行时的返回值。实际场景里
UriBuilder直接映射为默认端口的具体数值。 UriBuilder没有类似Uri.IsDefaultPort的属性,若需判断当前端口是否为协议默认值,需自行通过UriBuilder.Scheme匹配对应默认端口做对比。
示例代码(手动设置Port为-1):
Dim uriBuilder As New UriBuilder("https://website/application/login.aspx") uriBuilder.Port = -1 Console.WriteLine(uriBuilder.Uri.ToString()) ' 输出:https://website/application/login.aspx(无端口) Console.WriteLine(uriBuilder.Port) ' 输出:443
内容的提问来源于stack exchange,提问作者T.S.
相关产品推荐
相关产品推荐

