我有一个Windows窗体应用程序。当用户为我的应用程序导入许可证时,我想“打电话回家”(点击网页上的aspx页面)并注册许可证信息。
问题是用户可能没有在那时工作的互联网连接。我想先测试一下。检测用户是否有可用的互联网连接的最佳方法是什么?
答案 0 :(得分:11)
在PPOE上,至少有十万美元花在这个问题上。主要观点:
很多时候,HTTP连接会消失,然后返回“200 OK”消息。只有它不是你的网站;它是酒店/咖啡馆/提供连接你的任何路由器。
API将以有趣和创造性的方式存在。例如,如果您曾经拥有调制解调器,但某些Windows网络API会返回错误的连接数据,但随后升级到DSL,但未运行该向导。
在某些(非常重要的)地方,尝试连接将启动连接 - 拨号 - 每分钟收费。再次,在PPOE上他们发布了一个相当受欢迎的软件,它在凌晨3点完成了这项工作。为一些严重脾气暴躁的顾客而制作。
一些主要的互联网服务提供商在宽带上运行时拥有“独特”软件,而这些软件并不够聪明,只能使用它们所提供的优质以太网和TCP / IP。相反,他们使用以太网来模拟调制解调器(后者又设置为模拟以太网+ tcp / ip设置)。它被称为PPPOE,它很难分辨出你想要使用的适配器
越来越多的家庭使用DSL和Cabel调制解调器,计算机处于“连接”状态,但仅限于本地盒子;本地方框可能已失去连接,你永远不会知道。
唯一的解决方案是尝试连接并验证返回。
答案 1 :(得分:8)
// Create a new WebRequest Object to the mentioned URL.
WebRequest myWebRequest=WebRequest.Create("http://www.contoso.com");
Console.WriteLine("\nThe Timeout time of the request before setting is : {0} milliseconds",myWebRequest.Timeout);
// Set the 'Timeout' property in Milliseconds.
myWebRequest.Timeout=10000;
// This request will throw a WebException if it reaches the timeout limit before it is able to fetch the resource.
WebResponse myWebResponse=myWebRequest.GetResponse();
或者您可以调用InternetGetConnectedState API
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue ) ;
public static bool IsConnectedToInternet()
{
int Desc ;
return InternetGetConnectedState(out Desc, 0);
}
答案 2 :(得分:3)
在执行请求之前,我没有看到测试连接是否可用的任何优势。检查后连接仍然可能会断开,并且在尝试之前没有可靠的方法来告知您的请求是否有效。我也认为用户没有任何优势。
我会看到的唯一合法测试是,是否有任何可用的网络接口,以避免用户拨打拨号提示,以防他/她仍处于拨号连接。
答案 3 :(得分:1)
您可以向“主”主机发出ping命令,看它是否会返回回复。
答案 4 :(得分:1)
定义'互联网连接'。对我来说,没有'互联网连接'。只有tcp / ip连接,DNS服务器和Web服务器等。您可以做的最好的事情是尝试加载网页,看看它是否有效。正如所建议的那样,您可以尝试ping自己,但这并不意味着Web服务器正在运行,也不意味着可以加载页面。实际加载页面时,您才能确定这一点。
答案 5 :(得分:1)
我使用的一种方法是使用一个总是返回“true”的布尔方法创建一个web服务。从你的应用程序中调用它,如果你有任何例外或“假”,你就没有连接。
[WebMethod]
public bool IsAvailable()
{
return true;
}
并称之为:
private bool IsOnline()
{
Cursor = Cursors.WaitCursor;
var proxy = new WS();
bool IsOnline = false;
try
{
IsOnline = proxy.IsAvailable();
}
catch (System.Net.WebException WebEx)
{
NameValueCollection nvc = new NameValueCollection();
nvc.Add("WebException Status", WebEx.Status.ToString());
if (WebEx.Status == System.Net.WebExceptionStatus.ProtocolError)
{
nvc.Add("Status Code", ((System.Net.HttpWebResponse)WebEx.Response).StatusCode.ToString());
nvc.Add("Status Description", ((System.Net.HttpWebResponse)WebEx.Response).StatusDescription);
}
ExceptionManager.Publish(WebEx, nvc);
}
catch (Exception)
{
IsOnline = false;
}
Cursor = Cursors.Default;
return IsOnline;
}
答案 6 :(得分:0)
当我总是需要检查我的应用中的互联网连接时,我会ping google.com,因为它接缝永远不会停止。