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