.Net中获取HttpWebRequest所访问的IP地址

之前在论坛看到有人问过这样的问题 然后就帮着百度了一下 差不多得到了下面的代码

private IPEndPoint BindIPEndPoint(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount) {
    return remoteEndPoint;//得到IP
}

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://st233.com");
//绑定事件
request.ServicePoint.BindIPEndPointDelegate = BindIPEndPoint;

可是楼主说这样第一次访问是可以的 之后貌似取的就是缓存 就获取不到了 我也没有在意 毕竟这不是我的需求 可是今天自己有这样的需求了 然后我也忘记了以前回答过这样的问题 就去百度 然后居然看到了自己的回帖 也就是上面的代码 一脸懵逼 然后才想起原来自己以前百度过了 既然楼主都说有问题 而且同样的代码 百度到其他人也同样出现过这个问题 就没考虑这个解决方案了 虽然我可以通过HttpWebRequest去得到我想要的页面再通过Dns类去获取域名的IP 但是想想何必呢 HttpWebRequest坑定访问页面前也要获取Dns干嘛还要自己再去获取一次

然后琢磨着怎么入手 发现request.ServicePoint这个东西里面应该有我想要的东西 可是下面的属性中只找到一个看起来像是IP的属性就是[Address]可是他的类型并不是[IPAddress]里面是一些这样的数据

明显里面并没有自己想要的东西 于是乎干脆看看直接打印ServicePoint里面有什么东西

看到里面有这个东西 我猜是有八九就是我要的东西了 可是我不知道要怎么才能得到这个值 用反编译工具查看了一下这个类 里面并没有什么属性或者方法可以返回出m_IPAddressInfoList这个字段的字 既然没有现成的那么就自己动手反射咯

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://st233.com");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
IPAddress[] ips = request.ServicePoint.GetType()
    .GetField("m_IPAddressInfoList", BindingFlags.NonPublic | BindingFlags.Instance)
    .GetValue(request.ServicePoint) as IPAddress[];
foreach (var v in ips) Console.WriteLine(v.ToString());

搞定了 当然这里面可能有一个问题 比如访问baidu.com其实页面最后跳转到了www.baidu.com而得到的IP则可能不是你想要的baidu.com的IP 所以你想要靠谱一点那么就设置HttpWebRequest不要自动重定向 你自己去处理重定向来获取每一步的IP 而且现在那么网站有CDN得到的IP也不是真实的IP比如我的博客。。。


添加时间:2017-07-11 18:41:02 编辑时间:2017-07-11 18:48:57 阅读:1471 
捣鼓 C#
还没有人留言 要不你来抢一个沙发?
  • 编写评论

      我觉得区分大小写是一个码农的基本素质
[访问统计] 今天:25 总数:159057 提示:未成年人 请在大人陪同下浏览本站内容 还有:世界上最帅的码农 -> 石头 RSS:http://st233.com/rss Powered by -> Crystal_lz