c# - 有重定向时是否可以显示或跟踪 URL?
问题描述
我有一个作为跟踪 URL 的 URL,当我访问该 URL 时,它会重定向几次,直到它最终到达不重定向的 URL。
是否可以编写一个遵循重定向并将它们输出到控制台的函数?
解决方案
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 方法不是必需的,但对于将响应它的服务器,它会避免发送整个内容(当然,当不重定向时)。
推荐阅读
- node.js - 在 Elasticsearch 中搜索时考虑多个字段
- javascript - React Native 错误:有效负载不能超过 104857600 字节
- wordpress - 使用 Netlify 托管站点进行 WordPress 域/域转移
- c++ - clang 编译器不适用于“选择”命令
- mysql - mysql用where子句删除重复项
- go - 带有接口的 GoLang 模拟 sql 数据库
- flutter - Flutter:3次成功失败尝试后帐户锁定
- tensorflow - 使用 CONV2D + LSTM 堆叠
- azure - Terraform Plan 为 Windows 上的列表变量传递值
- python - 寻找所有使用 python pacakges 的 github 项目