使用 ipv6 地址连接到使用 HttpClient 的服务器(使用 ipv6 地址定义 URI) 修复 - 无效的 U

本文关键字:使用 地址 ipv6 URI 修复 无效 定义 HttpClient 服务器 连接 | 更新日期: 2023-09-27 18:37:21

我有一个简单的HttpClient,在使用ipv4/fqdb/主机名时可以完美运行(请参阅下面的代码片段)。但是,当我尝试使用ipv6地址连接到服务器时,相同的代码不起作用。我可能需要更改一些配置设置并能够使用 ipv6 地址定义 uri。

我看过msdn,它有以下声明:

如果主机名是 IPv6 地址,则使用规范的 IPv6 地址。删除 ScopeId 和其他可选的 IPv6 数据 - http://msdn.microsoft.com/en-us/library/system.uri.aspx

不知道这是什么意思,会试着弄清楚。

我可以尝试什么来解决问题?

看起来我需要将ipv6地址保留在方括号中[将其括起来" []]http://[fe08::83e7:71e8:1364:0dff%19]:58703/看起来现在一切正常。感谢如何在 URI 中包含带有(或不包含)区域索引的 ipv6 地址以进行 .NET 远程处理?

法典:

this.Client = new HttpClient();
**//below line throws UriFormatException (Invalid URI: Invalid port specified)**
this.Client.BaseAddress = new Uri(http://fe08::83e7:71e8:1364:0dff%19:58703/);
this.Client.DefaultRequestHeaders.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/xml"));
//whereas below code works, when ipv4/fqdn is used...
this.Client = new HttpClient();
this.Client.BaseAddress = new Uri(10.0.0.1:58501);
this.Client.DefaultRequestHeaders.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/xml"));

使用 ipv6 地址连接到使用 HttpClient 的服务器(使用 ipv6 地址定义 URI) 修复 - 无效的 U

您需要以 RFC 2732 指定的格式指定 URI。基本上,将实际的IPv6地址括在方括号中。

您提到的 ScopeId 是示例 URI 的"%19"部分。非常高级的挥手描述是"它基本上识别地址对应于本地计算机上的网络接口。如果您有兴趣,这篇超级用户帖子和这篇 MSDN 文章对它的实际含义进行了合理理解的详细描述。

在您的情况下,您真正需要知道的是,将其包含在 BaseAddress 属性中是没有意义/误导性的,因为该值仅对您的特定计算机有意义。在 HTTP 响应中发送它是没有意义的,因为该值对远程客户端没有任何意义。这就是为什么,正如你提到的文档所指出的,即使你把它包含在基址中,HttpClient也不会使用它。

最终更新的 URI 如下所示:

this.Client.BaseAddress = new Uri(@"http://[ef08::83e7:71e8:1364:0dff]:54502/");