Проверьте, подключен ли сайт к Сети, ограничьте время ожидания

#c#

#c#

Вопрос:

Я пытаюсь создать функцию, которая проверяет, подключен ли сайт к сети или нет, но у меня возникли некоторые проблемы с временем ожидания. Я хочу ограничить его максимум 3 секундами, если в течение 3 секунд нет ответа, я должен видеть страницу как автономную.

Моя попытка:

 class OnlineCheck
    {
        public static bool IsOnline(string url)
        {
            try
            {
                WebClient webclient = new WebClient();
                webclient.Headers.Add(HttpRequestHeader.KeepAlive, "1000");

                webclient.OpenRead(url);
            }
            catch { return false; }

            return true;
        }
    }
  

Ответ №1:

WebClient не поддерживает время ожидания. Но вы можете использовать HttpWebRequest!

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Endpoint);
request.Timeout=3000;
request.GetResponse();
  

Ответ №2:

Если вы хотите проверить, что сайт подключен к Сети, на самом деле вас интересует не содержимое страницы, а только то, что вы получаете ответ. Чтобы сделать это более эффективным, вы должны запрашивать только заголовки http. Вот краткий пример того, как вы могли бы сделать:

 private static IEnumerable<HttpStatusCode> onlineStatusCodes = new[]
{
    HttpStatusCode.Accepted,
    HttpStatusCode.Found,
    HttpStatusCode.OK,
    // add more codes as needed
};

private static bool IsSiteOnline(string url, int timeout)
{
    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
    {
        if (request != null)
        {
            request.Method = "HEAD"; // get headers only
            request.Timeout = timeout;
            using (var response = request.GetResponse() as HttpWebResponse)
            {
                return response != null amp;amp; onlineStatusCodes.Contains(response.StatusCode);
            }
        }
    }
    return false;
}
  

Ответ №3:

Используйте HttpWebRequest, а не WebClient. Класс HttpWebRequest имеет свойство timeout.

Ответ №4:

Вы можете попробовать этот код:

         System.Net.WebRequest r = System.Net.WebRequest.Create("http://www.google.com");
        r.Timeout = 3000;

        System.Net.WebProxy proxy = new System.Net.WebProxy("<proxy address>");
        System.Net.NetworkCredential credentials = new System.Net.NetworkCredential();

        credentials.Domain = "<domain>";
        credentials.UserName = "<login>";
        credentials.Password = "<pass>";

        proxy.Credentials = credentials;
        r.Proxy = proxy;

        try
        {
            System.Net.WebResponse rsp = r.GetResponse();
        }
        catch (Exception)
        {
            MessageBox.Show("Is not avaliable");
            return;
        }

        MessageBox.Show("Avaliable!");
  

Ответ №5:

 static bool isOnline (string URL)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
    request.Timeout = 3000;

    try
    {
        WebResponse resp = request.GetResponse();
    }
    catch (WebException e)
    {
        if (((HttpWebResponse)e.Response).StatusCode == HttpStatusCode.NotFound)
        {
            return false;
        }
    }

    return true;
}