3

我有一个简单的 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"));
4

1 回答 1

8

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

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

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

最终更新的 URI 如下所示:

this.Client.BaseAddress = new Uri(@"http://[ef08::83e7:71e8:1364:0dff]:54502/");
于 2013-10-30T07:52:07.400 回答