有点背景。我在一家拥有全球广域网的公司工作。外部用户通过VPN连接到它,并且必须连接到它,这样才能访问他们的电子邮件,当然还有共享的网络目录。
我有一个.Net应用程序是发布和安装从我们的网站使用ClickOnce。用户既可以为公司工作,也可以不为公司工作,用户可以访问该应用程序,并将请求发送到web服务,web服务也会发布到web服务器。
由于这个问题范围以外的原因,当用户试图登录应用程序时,他们应该通过显式引用服务器的计算机名称(即http://**server**/webservice/ws.asmx)连接到web服务服务器。如果用户没有连接到我们的广域网,他们需要通过我们的网址(即https://**www.companywebsite.com**/webservice/ws.asmx)访问它。
我知道如何动态地设置与web服务相关联的URL。我的问题是,我想不出一种快速、可靠和简单的方法来测试广域网连接。
最初,我尝试用相当短的超时时间向服务器发送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。我们的一些用户为拥有广域网的其他组织工作。因为我在.Net WinForms应用程序中检查他们的IP,所以他们的IP地址有可能与他们的广域网相关联。相反,我需要检查和看看他们是否专门连接到我们的广域网,而不仅仅是任何广域网。
我该怎么做?
发布于 2012-07-18 17:46:32
我认为问题是,如果公司网络内存在连接,而不是公共访问的internet,则需要解析主机名。
如果是这样的话,您可以使用DNS.BeginGetHostEntry并使用异步方法获取指定主机的域名系统。
e.g
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-18 16:55:07
不是在广域网上的用户能解析那个服务器IP吗?如果没有,则可以使用DNS查询来确定您所在的位置。
https://stackoverflow.com/questions/11546460
复制相似问题