使用非拆分隧道VPN将C#app连接到远程服务器的问题

时间:2015-03-19 02:12:24

标签: c# .net windows httpwebrequest vpn

我有C#(。Net 4.5)Winforms应用程序与互联网上托管的网络服务器进行通信。

它完美无瑕,直到我打开VPN,这是限制性的,不支持拆分隧道。

只有按照以下步骤才能重现:

  1. 启动.Net应用程序并向服务器发出HttpWebRequest - 这会按预期进行。
  2. 连接VPN客户端。 VPN配置为通过VPN路由所有流量(而不是"拆分隧道和#34;用于Intranet资源)
  3. VPN连接后,webrequest停止在.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)
    

  4. 关闭VPN,应用程序开始工作,请求再次通过。

    如果在应用程序启动之前VPN已经连接,则不会出现此问题。

    这适用于任何公共服务器,甚至https://www.google.com

    我在NetStat日志中密切关注所有这些情景,以及我观察到的内容:

    • 如果我让应用程序继续运行并打开VPN,应用程序仍会尝试使用旧的外部地址进行连接,然后失败。
    • 如果我使用VPN ON重启应用程序,应用程序现在连接到不同的代理外地地址,并且工作正常。

    我每次都会创建一个新的WebRequest。我尝试了所有可能的方法来强制应用程序每次使用更新的地址,但无法这样做。

    以下是我尝试过但没有做的一些事情:

    1. 刷新DNS恢复缓存
    2. 刷新ARP缓存
    3. 删除目标缓存
    4. 通过同一个.Net应用程序实例尝试多次ping到服务器。
    5. 尝试在路由表中为现有服务器IP路由添加路由到代理服务器IP。
    6. 请建议。

1 个答案:

答案 0 :(得分:0)

问题似乎出现在.Net框架中,它不会获取更新的地址。

为了解决这个问题,我在提交每个请求之前添加了:

webRequest.Proxy = WebRequest.GetSystemWebProxy();

有了这个,框架明确地从IE网络选项中获取更新的代理设置。