Можно ли отображать или отслеживать URL-адреса при наличии перенаправлений? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть URL-адрес, который является URL-адресом для отслеживания, и когда я посещаю URL-адрес, он несколько раз перенаправляется до тех пор, пока не получит URL-адрес, который не перенаправляется.

Можно ли написать функцию, которая будет следовать перенаправлениям и просто выводить их на консоль?

1 Ответ

1 голос
/ 08 апреля 2020
class Program
{
    private static readonly int MAX_REDIRECTS = 10;
    private static readonly string NL = Environment.NewLine;

    static void Main(string[] args)
    {
        DoRequest(new Uri("http://google.com/"));

        Console.ReadLine();
    }

    public static void DoRequest(Uri uri, int i = 0)
    {
        var request = WebRequest.CreateHttp(uri);
        request.AllowAutoRedirect = false;
        // Optional. May not work with all servers.
        //request.Method = WebRequestMethods.Http.Head;

        Uri redirectUri = null;

        try
        {
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                var httpStatus = (int)response.StatusCode;

                if (httpStatus >= 300 && httpStatus < 400)
                {
                    if (response.Headers[HttpResponseHeader.Location] != null)
                    {
                        redirectUri = new Uri(uri, response.Headers[HttpResponseHeader.Location]);
                    }

                    Console.WriteLine($"HTTP {httpStatus}\t{uri} ---> {redirectUri}");

                    if (++i >= MAX_REDIRECTS)
                    {
                        Console.WriteLine($"Limit of {MAX_REDIRECTS} redirects reached!{NL}");
                        return;
                    }
                }
                else
                {
                    Console.WriteLine($"HTTP {httpStatus}\t{uri}{NL}");
                }
            }
        }
        catch (Exception ex)
        {
            if (ex is WebException wex)
            {
                if (wex.Response is HttpWebResponse resp)
                {
                    Console.WriteLine($"HTTP {(int)resp.StatusCode}\t{uri}{NL}");
                    return;
                }
            }

            Console.WriteLine($"Failed!\t\t{uri}\t{ex.Message}{NL}");
        }

        if (redirectUri != null)
        {
            DoRequest(redirectUri, i);
        }
    }
}

Метод HEAD не требуется, но для серверов, которые будут отвечать на него, он избегает отправки всего контента (если, конечно, не перенаправлен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...