You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:03:10