如何在使用该 URL 加载 Web 视图之前知道网站/域是否可用

本文关键字:网站 是否 视图 URL Web 加载 | 更新日期: 2023-09-27 17:56:37

你好,我正在尝试从用户输入的 URL 启动带有 Web 视图的意图,我一直在网上到处寻找,但我找不到关于如何确保网站在允许用户继续下一个活动之前实际连接的具体答案。我找到了很多工具来确保URL遵循正确的格式,但没有一个可以真正让我确保它可以实际连接。

如何在使用该 URL 加载 Web 视图之前知道网站/域是否可用

您可以使用

WebClient并检查是否抛出任何异常:

using (var client = new HeadOnlyClient())
{
    try
    {
        client.DownloadString("http://google.com");
    }
    catch (Exception ex)
    {
        // URL is not accessible.
    }
}

您可以捕获更具体的异常以使其更优雅。

您还可以使用对 WebClient 的自定义修改来仅检查 HEAD 并减少下载的数据量:

class HeadOnlyClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest req = base.GetWebRequest(address);
        req.Method = "HEAD";
        return req;
    }
}

我建议您使用 HttpHead 进行 AndroidHttpClient 的简单请求,但现在已弃用。您可以尝试通过套接字实现 HEAD 请求。

您可以先尝试 ping 地址。

请参阅此SO问题:如何从Java Androidping外部IP

另一种选择:Xamarin 和 Windows 的连接插件

Task<bool> IsReachable(string host, int msTimeout = 5000);

但是,不能保证任何成功的预检查,因为下一个请求可能会失败,因此您仍应处理该请求。

这是我最终所做的检查主机名是否可访问。我正在使用自签名证书连接到站点,因此这就是我在ServiceCertificateValidationCallback中使用委托的原因。

private async Task<bool> CheckHostConnectionAsync (string serverName)
    {
        string Message = string.Empty;
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serverName);
        ServicePointManager.ServerCertificateValidationCallback += delegate 
        {
            return true;
        };
        // Set the credentials to the current user account
        request.Credentials = System.Net.CredentialCache.DefaultCredentials;
        request.Method = "GET";
        request.Timeout = 1000 * 40; 

        try
        {
            using (HttpWebResponse response =  (HttpWebResponse) await request.GetResponseAsync ())
            {
                      // Do nothing; we're only testing to see if we can get the response
            }
        }
        catch (WebException ex)
        {
            Message += ((Message.Length > 0) ? "'n" : "") + ex.Message;
            return false;
        }

        if (Message.Length == 0) 
        {
            goToMainActivity (serverName);
        }
        return true; 
    }