1

一点背景。我为一家拥有全球 WAN 的公司工作。外部用户通过 VPN 连接到它,并且必须连接到它才能访问他们的电子邮件,当然还有共享的网络目录。

我有一个使用 ClickOnce 从我们的网站发布和安装的 .Net 应用程序。为公司工作和不工作的用户都可以访问此应用程序,并将请求发送到也发布到 Web 服务器的 Web 服务。

由于此问题范围之外的原因,当用户尝试登录应用程序时,他们应该通过显式引用服务器的计算机名称来连接到 Web 服务服务器(即http://**server**/webservice/ws.asmx。)如果用户未连接到我们的 WAN,他们需要通过我们的网址访问它(即https://**www.companywebsite.com**/webservice/ws.asmx。)

我知道如何动态设置与 Web 服务关联的 URL。我的问题是我想不出一种快速、可靠和简单的方法来测试 WAN 连接。

Ping最初,我尝试以相当短的超时时间向服务器发送 ping 请求(使用 .Net类)。但是,当未连接到 WAN 时,对服务器调用 ping 操作会返回一个异常,指出

Ping 请求期间发生异常。

下面是与测试 WAN 连接的属性关联的代码。这很简单,但是当我在我们的网络上测试它时,它一直给我上面的信息。

public static bool ConnectedToWAN
{
  get
  {
    try
    {
      Ping ping = new Ping();
      PingReply reply = ping.Send("server", 2000);
      return reply.Status == IPStatus.Success;
    } 
    catch (Exception e) 
    {/* ' An exeception occurred during the Ping request.' */};
  }

我宁愿不根据我得到的异常返回我的连接状态。相反,我会明确调用可以验证连接的网络。

一个快速说明,我无法检查用户的 IP。我们的一些用户为拥有自己的 WAN 的其他组织工作。由于我在 .Net WinForms 应用程序中检查他们的 IP,因此他们的 IP 地址可能与他们的 WAN 相关联。相反,我需要检查它们是否专门连接到我们的WAN,而不仅仅是任何WAN。

我怎样才能做到这一点?

4

2 回答 2

1

不在 WAN 上的用户能否解析该服务器 IP?如果没有,您可以使用 DNS 查询来确定您的位置。

于 2012-07-18T16:55:07.280 回答
1

我认为问题是如果在公司网络内连接而不是公共可访问的互联网,则您需要解析主机名。

如果是这种情况,您可以使用 DNS.BeginGetHostEntry 并使用异步方法获取指定主机的域名系统。

例如

var host = '**Internal Server Name**';
Boolean isWANConnected = false;
String ConnectMessage ;
AsyncCallback callBack = new AsyncCallBack(GetHostName);
Dns.BeginGetHostEntry(host, callBack, host);

static void GetHostName(IAsyncResult result)
{
  string hostname = (string)result.AsyncState;
  try
  {
     IPHostEntry host = Dns.EndGetHostEntry(result)
     ConnectMessage = host as String;
  }
  catch(SocketException e)
  {
    isWANConnected = false;
    ConnectMessage = e.Message;
  }
}
于 2012-07-18T17:46:32.647 回答