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/,这样子是不行的。
怎么办呢?
有两种方法:
- 修改Hosts文件,指定xxx.com 解析到5.6.7.8 上面去。
- 使用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());
参考代码如下(代码来自参考资料一):
using System;
using System.IO;
using System.Net;
namespace ConsoleApplication1
{
class Program { public static void Main(string[] args) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.example.com/Default.aspx"); System.Net.WebProxy proxy = new WebProxy("208.77.186.166", 80); request.Proxy = proxy; using (WebResponse response = request.GetResponse()) { using (TextReader reader = new StreamReader(response.GetResponseStream())) { string line; while ((line = reader.ReadLine()) != null) Console.WriteLine(line); } } } }
}
这样子就实现了指定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.
参考资料:
HttpWebRequest.Headers["Host"] throws an unexpected exception
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java总结 - 抽象类与接口
本文是自己对抽象类和接口的理解,如果不对请指正,谢谢 抽象类的简介 抽象?抽象是什么意思?之前在我的 封装继承多态 一文中提到了一个杯子的概念,简单概括一下就是嘴说出来的是一个抽象的概念,因为并不知道这个杯子的具体参数,比如颜色之类的特点,所以抽象也就是将一个事物的大体结构提取出来,比如我的杯子有盖子,是保温的等,然而盖子是弹射开的还是拧开的以及保温材料的使用一概不知,所以对应到Java中的抽象类,那么这个 抽象类也就是对一个事物的概括,(只是嘴说出来的) 之前提到的is-a和has-a在这看来,抽象类更符合is-a的关系,抽象类可以提供方法实现,也可以不提供,但是其被称为抽象类的话,那么必定在类描述上有abstract关键字,而其中的方法完全可以没有抽象方法的定义 方法提供实现与否即是否是抽象方法,就像是你看中一款杯子,但是杯子的提供商
- 下一篇
我们3666人的【阿里Java技术进阶】钉钉大群,又增添新 “成员” 啦~
上周五在社区给大家介绍了下我们的【阿里Java技术进阶】钉钉群,慕名而来了很多新的小伙伴加入,离我们的史上最大Java群又近了一步。而就在刚刚,小编又得到了个新的消息,我们的钉钉群中又加入了个新的功能“社区搜索机器人”。下面就看看此项功能的强大之处吧!!! 在钉钉群中@社区搜索机器人 后输入我们的Java特邀专家徐雷之后,机器人迅速就给到了回复,把专家徐雷的相关文章一口气都搜索出来啦~ 嘿嘿~还挺方便哒~小编怀着好奇的心情再搜个我们社区的PG大牛德哥试试,机器人依然回应的如此迅速 屡试不爽的小编再搜个沙龙试试,居然把近期的线下沙龙都找了出来,机器人功能太强大了吧!!!小编感到自愧不如啊,呜呜~~~ 如果你是社区的粉丝、如果你是Java的忠实爱好者,你要是还不在此群的话,就要落伍啦~~~作为阿里旗下的办公交流工具钉钉正迅速普及使用,我们要打
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果