c# - 使用 ipv6 地址连接到使用 HttpClient 的服务器(使用 ipv6 地址定义 URI)修复 - 无效的 URI : Invalid port specified)

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

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

我查看了 msdn,它有以下声明:

If the host name is an IPv6 address, the canonical IPv6 address is used. ScopeId and other optional IPv6 data are removed - http://msdn.microsoft.com/en-us/library/system.uri.aspx

不知道是什么意思,会试着弄明白。

我可以尝试如何解决这个问题?

看起来我需要将 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"));

最佳答案

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

您提到的 ScopeId 是示例 URI 的“%19”部分。非常高级的挥手描述是“它基本上识别地址对应于本地机器上的哪个网络接口(interface)”。 This Super User postthis MSDN article如果您有兴趣,可以对其实际含义进行合理易懂的详细描述。

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

最终更新的 URI 如下所示:

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

关于c# - 使用 ipv6 地址连接到使用 HttpClient 的服务器(使用 ipv6 地址定义 URI)修复 - 无效的 URI : Invalid port specified),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19676265/

相关文章:

c# - 单击事件需要两次单击才能在 asp.net 中触发

c# - 如何只验证 ASP .NET MVC 中模型的一部分?

c# - 如何动态加载Prism/Composite Application Library中的模块?

c# - 创建用户时出错 - ASP.NET System.Web.Providers

asp.net - 通过网页控制用户的 USB 设备?可能的?

c# - 什么时候应该使用 `out` 参数而不是返回复杂类型?

c# - 使用接口(interface)名称创建类实例的概念是什么?

c# - 申请取消关机

javascript - Angularjs $http 无法从 Asp.net webapi 4 获取数据

.net - 如何从 NuGet 包提供全局 AnalyzerConfig 文件?