一点背景知识。我在一家拥有全球广域网的公司工作。外部用户通过VPN连接到它,必须连接到它才能访问他们的电子邮件,当然还有共享网络目录。
我有一个.Net应用程序,使用ClickOnce从我们的网站发布和安装。既为公司工作又不工作的用户可以访问此应用程序,并将请求发送到也发布到Web服务器的Web服务。
出于此问题范围之外的原因,当用户尝试登录应用程序时,他们应通过显式引用服务器的计算机名称(即http://**server**/webservice/ws.asmx
)来连接到Web服务服务器。)如果是用户未连接到我们的WAN,他们需要通过我们的网址(即https://**www.companywebsite.com**/webservice/ws.asmx
)访问它。)
我知道如何使用Web服务动态设置关联的URL。我的问题是我无法想到一种快速,可靠和简便的方法来测试WAN连接。
最初我尝试将ping请求(使用.Net Ping
类)发送到服务器,并且暂停时间相当短。但是,在未连接到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。
我该怎么做?
答案 0 :(得分:1)
WAN上的用户是否可以解析该服务器IP?如果没有,您可以使用DNS查询来确定您的位置。
答案 1 :(得分: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;
}
}