首页 > 解决方案 > 有重定向时是否可以显示或跟踪 URL?

问题描述

我有一个作为跟踪 URL 的 URL,当我访问该 URL 时,它会重定向几次,直到它最终到达不重定向的 URL。

是否可以编写一个遵循重定向并将它们输出到控制台的函数?

标签: c#

解决方案


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 方法不是必需的,但对于响应它的服务器,它会避免发送整个内容(当然,当不重定向时)。


推荐阅读