C# 使用ipv6地址连接到使用HttpClient的服务器(使用ipv6地址定义URI)修复-无效URI:指定的端口无效)

C# 使用ipv6地址连接到使用HttpClient的服务器(使用ipv6地址定义URI)修复-无效URI:指定的端口无效),c#,asp.net,.net,asp.net-mvc,vb.net,C#,Asp.net,.net,Asp.net Mvc,Vb.net,我有一个简单的HttpClient,它在使用ipv4/fqdb/主机名时可以完美地工作(请参阅下面的代码片段)。然而,当我试图使用ipv6地址连接到服务器时,同样的代码就不起作用了。我可能需要更改一些配置设置,并能够使用ipv6地址定义uri 我已经看过msdn,它有以下声明: 如果主机名是IPv6地址,则使用规范IPv6地址。ScopeId和其他可选IPv6数据已删除- 我不知道这意味着什么,我会设法弄明白的 我可以试着解决这个问题吗 看起来我需要将ipv6地址保留在方括号中[将其括起来'[]

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

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

如果主机名是IPv6地址,则使用规范IPv6地址。ScopeId和其他可选IPv6数据已删除-

我不知道这意味着什么,我会设法弄明白的

我可以试着解决这个问题吗

看起来我需要将ipv6地址保留在方括号中[将其括起来'[]]] 现在看来一切都正常了。多亏了

代码:


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

您提到的ScopeId是示例URI的“%19”部分。非常高级的、挥手的描述是“它基本上标识了地址对应于本地机器上的哪个网络接口”。如果您感兴趣的话,对它的实际含义有合理理解的详细描述

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

最终更新的URI如下所示:

this.Client.BaseAddress=新Uri(@“http://[ef08::83e7:71e8:1364:0dff]:54502/”;
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"));