我们有一个用C#编写的临时SOAP客户端,可以从windows移动设备连接到桌面上的CXF服务。当此设备通过ActiveSync连接时,它会为RNDIS连接创建一个虚拟适配器。此虚拟适配器将网关IP分配给主机169.254.2.2
。
当我们尝试使用C#客户端中的主机名或主机的IP设置为地址进行连接时,一切都工作得很好。但是,当我们将IP设置为RNDIS网关(169.254.2.2
)时,服务器端的连接会周期性地丢失。CXF服务不断尝试连接,并最终成功,但这会导致连接速度大大减慢。我们在移动CXF端的日志中没有报告错误,只在C#服务器上报告了错误。
有谁知道为什么会发生这种事吗?在排除169.254.2.2
之前,我们需要断言它不可能用作有效的端点。
哦,以防有帮助,在ActiveSync连接之后,通过DHCP向C#客户端授予IP 169.254.2.1
。
发布于 2012-01-31 09:09:53
我找到了问题的原因,但我觉得回答起来很糟糕,因为我怀疑其他人可能会猜到这就是问题所在:
在我们的CXF服务器上,我们有一个对InetAddress.getHostName()
的调用,它基本上对从C#客户端发送的请求执行反向DNS查找。
当使用DNS地址时,DNS169.254.2.1(当然)中没有条目,因此ActiveSync类将挂起,直到方法超时(这需要大约20秒才会向C#客户端写入响应)。在每次请求20秒时,这会导致大量的速度减慢和丢失连接错误。
我们通过将调用移动到半秒后强制结束的executor线程修复了这个问题。因为它在另一个线程中,减速变得不存在。很高兴这一切都结束了!
发布于 2012-01-12 05:29:56
我想到的第一个问题是来自DHCP服务器的IP的租用时间即将到期,而CXF服务器必须等待DCHP服务器发出新的租用。
如果您知道IP不会更改,请尝试延长DCHP租期,并尽可能使用静态IP。这至少会消除故障点。
https://stackoverflow.com/questions/8580990
复制相似问题