原文:http://www.cnblogs.com/greenerycn/archive/2010/04/11/httpwebreques_host_modify_By_set_proxy.html

我有这么一个需求:

一个域名,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());

参考代码如下(代码来自参考资料一):
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.

参考资料:

  1. HttpWebRequest.Headers["Host"] throws an unexpected exception

c#中HttpWebRequest使用Proxy实现指定IP的域名请求的更多相关文章

  1. 一个服务器上面配置多个IP ,实现指定IP的域名请求

    //配置多个IP命名using System.Net; //********************************************************************** ...

  2. C# 使用WebClient时,在多网卡时,指定IP发送Web请求

    需要定义一个类,重写GetWebRequest,在方法内,指定IP地址 public class MyWebClient : WebClient { private IPAddress ipAddre ...

  3. linux中利用iptables+geoip过滤指定IP

    1. 前提条件 iptables >= 1.4.5 kernel-devel >= 3.7 2.  安装依赖包  代码如下 复制代码 # yum install gcc gcc-c++ m ...

  4. VisualSVN server搭建装配和指定IP或域名

    在主机商边绑定A记录即可

  5. Linux 下获取LAN中指定IP的网卡的MAC(物理地址)

    // all.h// 2005/06/20,a.m. wenxy #ifndef _ALL_H#define _ALL_H #include <memory.h>#include < ...

  6. pycharm中指定ip和端口

    pycharm中指定ip和端口 环境: 系统:win7 本机ip:192.168.0.100 1.建立工程请参照:https://www.cnblogs.com/effortsing/p/103945 ...

  7. 浅谈C#中HttpWebRequest与HttpWebResponse的使用方法

    1.第一招,根据URL地址获取网页信息get方法 public static string GetUrltoHtml(string Url,string type) { try { System.Ne ...

  8. C#中HttpWebRequest与HttpWebResponse的使用方法

    关键字:C# HttpWebRequest HttpWebResponse HTTP GET POST 请求 这个类是专门为HTTP的GET和POST请求写的,解决了编码,证书,自动带Cookie等问 ...

  9. 修改hosts文件在本地使域名解析到指定IP

    # Additionally, comments (such as these) may be inserted on individual  # lines or following the mac ...

随机推荐

  1. Java--CJDP

    was定义,包定义, 1. Java的接口概念 进行封装,方便的使用 2. 包定义,Java 中多种包,进行迁移使用,包的导入,例如对数据库的操作Hibernate 3. 配置文件xml和json,对 ...

  2. Debug Intro

    The ABAP Debugger is used tool to execute and analyze programs line by line. Using it we can check t ...

  3. zedboard - 轻量级以太网控制器LWIP

    ipconfig/all route print  显示本机所有的网络 网关是什么 那么网关到底是什么呢?网关实质上是一个网络通向其他网络的IP地址.比如有网络A和网络B,网络A的IP地址范围为&qu ...

  4. Coolpy使用教程

    ---恢复内容开始--- Coolpy使用教程 1.硬件:arduino+ Ethernet Shield w5100 2.下载硬件rom,然后将rom烧进arduino. (下载地址)http:// ...

  5. Android SDK 更新失败

    万恶的墙,调查兵团赶紧把墙拆了.大家一起跟巨人打一架. 解决方法是改hosts文件 添加 74.125.237.1 dl-ssl.google.com ok,good job 多亏了http://bl ...

  6. Discuz 3.X 门户文章插入图片自动添加 alt 标签

    最近用 Discuz 搭建了个网站--儿童安全座椅网(www.bbseat.com.cn),用到了门户功能,不得不说Discuz 的功能还是非常强大的,但在使用过程中发现在发表文章时添加了图片却不能像 ...

  7. 应用js改变问章字体大小

    刚来公司的时候领导给分配的都是一些简单的简单的简单的.....任务 一次叫我把文章的字体大小变换功能写出来.在网上搜了很多都不管用!不过功夫不负有心人还是被我找到了!拿出来分享下! <scrip ...

  8. execute连接 类型

    set rs=server.createobject("adodb.recordset") sql="select top 10 id,name from tablena ...

  9. 关于C语言指针中的p++与p+i

    先看一组代码: #include <stdio.h> void main() { int i,*p,a[7]; p=a; for(i=0;i<7;i++) scanf("% ...

  10. 数据的增量更新之EXISTS

    有时候需要实现是数据的增量更新,因为更新全量会带来时间跟数据库资源的浪费,还有可能是数据出现冗余,所以需要使用增量数据同步,下面是一个数据增量同步的小实例. ---drop table A CREAT ...