我有一个 Windows 窗体应用程序。当用户为我的应用程序导入许可证时,我想“打电话回家”(点击网络上的 aspx 页面)并注册许可证信息。
问题是用户当时可能没有互联网连接。我想先测试一下。检测用户是否有可用的互联网连接的最佳方法是什么?
我有一个 Windows 窗体应用程序。当用户为我的应用程序导入许可证时,我想“打电话回家”(点击网络上的 aspx 页面)并注册许可证信息。
问题是用户当时可能没有互联网连接。我想先测试一下。检测用户是否有可用的互联网连接的最佳方法是什么?
在 PPOE 上,至少在这个问题上花费了十万美元。主要难点:
很多时候,HTTP 连接会断开,然后返回“200 OK”消息。只是它不是您的网站;它是酒店/咖啡厅/任何提供连接您的路由器。
API 将以有趣和创造性的方式存在。例如,如果您以前有调制解调器,但后来升级到 DSL,但没有运行向导,则某些 Windows 网络 API 会返回错误的连接数据。
在某些(非常重要的)地方,尝试连接会启动连接——在拨号时——按分钟收费。同样,在 PPOE,他们在凌晨 3:00 发布了一款相当受欢迎的软件。专为一些脾气暴躁的客户制作。
一些主要的 ISP 在宽带上运行时拥有“独特”的软件,但它们不够聪明,无法仅使用提供的良好以太网和 TCP/IP。相反,他们使用以太网来模拟调制解调器(反过来设置为模拟以太网 +tcp/ip 设置)。它被称为 PPPOE,很难分辨您尝试使用的适配器
越来越多的家庭正在使用 DSL 和电缆调制解调器,其中计算机“连接”,但仅限于本地盒子;本地盒子可能已失去连接,您永远不会知道。
唯一的解决方案是尝试连接并验证返回。
// 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);
}
在执行请求之前测试连接是否可用,我看不到任何优势。在您检查后连接仍可能断开,并且在您尝试之前没有可靠的方法来判断您的请求是否有效。我也看不到对用户有任何好处。
我会看到的唯一合法测试是是否有任何可用的网络接口,以避免在他/她仍在拨号连接的情况下使用拨号提示惹恼用户。
您可以向“家庭”主机发送 ping 指令,查看它是否返回回复。
定义“互联网连接”。对我来说,没有“互联网连接”。只有 tcp/ip 连接、dns 服务器和 web 服务器等。你能做的最好的就是尝试加载网页,看看它是否有效。正如建议的那样,您可以尝试 ping 自己,但这并不意味着 Web 服务器正在运行,也不意味着可以加载页面。只有在实际加载页面时才能确定这一点。
我使用的一种方法是使用始终返回“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;
}
当我总是需要在我的应用程序中检查互联网连接时,我只会 ping google.com,因为它永远不会关闭。