【发布时间】:2015-05-22 01:33:10
【问题描述】:
我有 C# (.Net 4.5) Winforms 应用程序与托管在 Internet 上的网络服务器通信。
它完美无瑕,直到我打开限制性且不支持拆分隧道的 VPN。
只有按照以下步骤才能重现:
- 启动 .Net 应用程序并向服务器发出 HttpWebRequest - 这按预期进行。
- 连接 VPN 客户端。 VPN 配置为通过 VPN 路由所有流量(与 Intranet 资源的“拆分隧道”相反)
-
VPN 连接后,网络请求在 .NET 应用程序中停止工作。 .NET 应用程序开始在
HttpWebRequest.GetResponse上获得通用的“无法连接到远程服务器”:System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond xxx.xxx.xxx.206:443 at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception) --- End of inner exception stack trace --- at System.Net.HttpWebRequest.GetResponse() at DNSCacheTest.Form1.SendWebRequest(String url)
关闭 VPN,应用开始工作,请求再次通过。
如果在应用启动前VPN已经连接,则不会出现问题。
这适用于任何公共服务器,甚至是https://www.google.com。
我一直关注 NetStat 日志以了解所有这些情况,这是我观察到的:
- 如果我让应用程序继续运行并打开 VPN,应用程序仍会尝试使用旧的外部地址进行连接,但失败了。
- 如果我在 VPN 开启的情况下重新启动应用程序,应用程序现在会连接到不同的代理外部地址,并且工作正常。
我每次都创建一个新的WebRequest。我尝试了所有可能的方法来强制应用程序每次都使用较新的地址,但无法这样做。
以下是我尝试过但没有奏效的几件事:
- 刷新的 DNS 恢复缓存
- 刷新的 ARP 缓存
- 已删除目标缓存
- 尝试通过同一个 .Net 应用实例多次 ping 服务器。
- 尝试在路由表中添加路由,以便将现有服务器 IP 路由到代理服务器 IP。
请指教。
【问题讨论】:
标签: c# .net windows httpwebrequest vpn