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

Dre*_*mer 3 .net c# vb.net asp.net asp.net-mvc

我有简单的HttpClient,它在使用ipv4/fqdb /主机名时非常有效(请参阅下面的代码片段).但是相同的代码不起作用,momemnt我试图使用ipv6地址连接到服务器.我可能需要更改一些配置设置并能够使用ipv6地址定义uri(我查看了msdn并且它具有以下语句 - 如果主机名是IPv6地址,则使用规范的IPv6地址 .ScopeId和其他可选的IPv6数据被删除 - http://msdn.microsoft.com/en-us/library/system.uri.aspx - 不确定它意味着什么,将试图明天解决它).

同时,任何解决问题的想法/想法/方法都非常有用:).


看起来我需要在schedred括号中保留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"));
Run Code Online (Sandbox Code Playgroud)

问候.

Dan*_*rge 7

您需要以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/");
Run Code Online (Sandbox Code Playgroud)