2007年8月30日

不够厚道的Microsoft

仍然在做IPV6的对应工作......

说起来,我原来一直都是对.NET Framework抱有好感的,对MSDN的各种说明也是比较信任的。然而,当我深入研究了System.Net命名空间下的Dns.GetHostAddress(string hostNameOrAddres)方法后,我的心情只能用一个词来形容,那就是"失望"。

这个方法是微软在.NET Framework V2.0中新加入的方法。作用是解析用户输入的域名/地址,生成一个或多个抽象的IPAddress对象。

在该方法的说明文档中(不知道为什么,关于该方法,中文或日文的MSDN中没有任何说明),对于返回值的定义存在如下描述:

If hostNameOrAddress is an IP address, this address is returned without querying the DNS server.


然而,实际情况是:当操作系统没有启用IPV6时,如果用户输入一个IPV6的地址(比如"fe3b::234:4b35"时)。Dns.GetHostAddress方法根本不会解析出一个IPAddress对象,而是直接抛出了一个SocketException,其对应的Winsock Error Code为11001(WSAHOST_NOT_FOUND).看来在系统未启用IPV6的情况下,这个API是把用户输入的IPV6地址当作普通域名来处理了。

然而匪夷所思的事情还有呢。当我把系统的IPV6启用,但停用IPV4时,尝试输入一个IPV4地址。本来按照思维定势,以为它也会抛一个SocketException。然而此时它却没有抛异常,而是返回给我一个长度为0的IPAddress数组,真是让我哭笑不得。

根据我的实际测试结果,对Dns.GetHostAddress(string)方法的返回值做了如下总结:






















输入的域名/地址形式 只启用了IPV4 只启用了IPV6 启用了IPV4+IPV6
IPV4型地址 长度为1的IPAddress数组 长度为0的IPAddress数组 长度为1的IPAddress数组
IPV6型地址 抛出SocketException 长度为1的IPAddress数组 长度为1的IPAddress数组
普通域名 长度为n的IPAddress数组(*) 长度为n的IPAddress数组(*) 长度为n的IPAddress数组(*)

(*: 具体的数组长度,需要根据DNS服务器的实际绑定,或者HOST文件中的定义来决定)


由此可见,我觉得微软对于这个方法的设计是存在比较严重的败笔的。首先,该API的实际动作在IPV4环境和IPV6环境表现不一致;另外,关于输入IPV6型IP地址会导致SocketException的情况,在MSDN关于该方法的说明文档中并没有提及,唯一关于输入IP地址的叙述,与该方法的实际效果其实是南辕北辙的。

其实,设计函数也是门学问。至少,应该友好一点吧~

没有评论: