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

时间:2013-10-30 07:28:41

标签: c# asp.net .net asp.net-mvc vb.net

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

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


看起来我需要在squered括号中保留ipv6地址[将其封闭'[]'] http://[fe08::83e7:71e8:1364:0dff%19]:58703/看起来现在一切正常。感谢How to include ipv6 addresses with (or without) zone indexes in uri for .net remoting?


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"));

问候。

1 个答案:

答案 0 :(得分:7)

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

你提到的ScopeId是你的示例URI的“%19”部分。非常高级的,挥手的描述是“它基本上识别了地址在本地机器上对应的网络接口。”如果您感兴趣的话,This Super User postthis MSDN article可以合理地理解它的实际含义。

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

最终更新的URI如下所示:

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