阿哥论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 497|回复: 0

c#中HttpWebRequest使用Proxy实现指定IP的域名请求

[复制链接]

2018

主题

1

好友

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

优秀会员 助人为乐 辛勤工作 技术精英 多才多艺 优秀班竹 灌水天才 星球管理 宣传大使 灌水之王 财富勋章 版主勋章 动漫勋章 勤奋会员 论坛精英 PS高手 心 8 闪游皮肤 双鱼座 8★8➹ 志愿者 乖

发表于 2015-7-8 15:15:59 |显示全部楼层
C#中HttpWebRequest使用Proxy实现指定IP的域名请求
我有这么一个需求:
     一个域名,xxx.com,它后面其实有很多个iP:比如:
  • 1.2.3.4,
  • 5.6.7.8,
  • 9.10.11.12

这些ip上面都有同样的网站,域名解析的时候会随机分配一个ip给你(这个就是DNS负载均衡)。
但是现在假如我想访问一个特定IP的上的网站,比如5.6.7.8上的网站,但是由于网站限制了必须通过域名才能访问,直接把域名改成ip地址形成的url如:http://5.6.7.8/,这样子是不行的。


怎么办呢?
有两种方法:
1. 修改Hosts文件,指定xxx.com 解析到5.6.7.8 上面去。
2. 使用http://5.6.7.8/这个url,不过在请求包的head头里增加一句:
Host:xxx.com

由于我是通过C#代码来实现这个功能,所以就想通过第2种方法解决。

C#中是用HttpWebRequest类来实现获取一个http请求的。它有一个Header的属性,可以修改Header里头的值。不过查询MSDN得知,这个Host标识是没办法通过这种方法修改的。如果你这么使用:
httpWebRequest.Headers["Host"] =”xxx.com”;
它会抛出一个异常出来:
ArgumentException: The 'Host' header cannot be modified directly。
那还能不能实现上面的需求呢?答案是能,不过方法要改一下:
Url里面还是使用域名:
http://xxx.com/
设置HttpWebRequest的Proxy属性为你想访问的IP地址即可,如下:
httpWebRequest.Proxy = new WebProxy(ip.ToString());

参考代码如下(代码来自参考资料一):
  1. using System;
  2. using System.IO;
  3. using System.net;

  4. namespace Consoleapplication1
  5. {
  6.     class Program
  7.     {
  8.         public static void Main(string[] args)
  9.         {
  10.             HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.example.com/Default.aspx");
  11.             System.Net.WebProxy proxy = new WebProxy("208.77.186.166", 80);
  12.             request.Proxy = proxy;
  13.             using (WebResponse response = request.GetResponse())
  14.             {
  15.                 using (TextReader reader = new StreamReader(response.GetResponseStream()))
  16.                 {
  17.                     string line;
  18.                     while ((line = reader.ReadLine()) != null)
  19.                         Console.WriteLine(line);
  20.                 }
  21.             }
  22.         }
  23.     }
  24. }
复制代码
这样子就实现了指定IP的域名请求。
附:有人已经向微软反馈了无法修改host头的问题,微软反馈说下一个.Net Framewok中将增加一个新的Host属性,这样子就可以修改Host头了。
原文:
Microsoft 在 2009/5/26 13:37 发送
The next release of the .NET Framework will include a new "Host" property. The value of this property will be sent as "Host" header in the HTTP request.
参考资料:


c#中HttpWebRequest使用Proxy实现指定IP的域名请求
http://www.cnblogs.com/greeneryc ... y_By_set_proxy.html

该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

回顶部