苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 14677|回复: 4

[其他] c#中HttpWebRequest使用Proxy实现指定IP的域名请求 急询https的方法如何实现?

[复制链接]
发表于 2013-7-3 11:43:28 | 显示全部楼层 |阅读模式
本帖最后由 angelo 于 2013-7-3 11:44 编辑

以下是另一个牛人的方法:

我有这么一个需求:

     一个域名,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. }
复制代码

但是问题来了


如果是https的站点,我修改后报错如下:

[System.Net.WebException] = {"基础连接已经关闭: 接收时发生错误。"}
[System.IO.IOException] = {"无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。"}


using System;
using System.IO;
using System.Net;

namespace ConsoleApplication1
{
class Program
{
public static void Main(string[] args)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.example.com/Default.aspx");
System.Net.WebProxy proxy = new WebProxy("208.77.186.166", 443);
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);
}
}
}
}
}


............................................................................................................................

System.Net.WebProxy proxy = new WebProxy("https://208.77.186.166");
如果改成这个格式,则报错
ServicePointManager 不支持具有 https 方案的代理。


希望大神能帮助下





1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-7-3 12:05:36 | 显示全部楼层
httpWebRequest.Proxy 这不是代理 吗?这能起做用,我还真不清楚。
基础连接已经关闭: 接收时发生错误
这种是需要证书的问题,你可以使用我的Httphelper类来解决这个问题
具体你说的方案
就是要访问一个域名指定的IP这种情况,
            request.Host直接这样就可以了,
在4.0里可以直接使用,升级一下net版本完事

 楼主| 发表于 2013-7-3 12:50:16 | 显示全部楼层
站长苏飞 发表于 2013-7-3 12:05
httpWebRequest.Proxy 这不是代理 吗?这能起做用,我还真不清楚。
基础连接已经关闭: 接收时发生错误
这 ...

谢谢,非常感谢
发表于 2013-11-1 10:29:10 | 显示全部楼层
站长苏飞 发表于 2013-7-3 12:05
httpWebRequest.Proxy 这不是代理 吗?这能起做用,我还真不清楚。
基础连接已经关闭: 接收时发生错误
这 ...

同样的代理IP的问题,我的却是这个错误。。。{:soso_e117:}
QQ图片20131101102729.jpg
发表于 2013-11-1 10:37:50 | 显示全部楼层
木木 发表于 2013-11-1 10:29
同样的代理IP的问题,我的却是这个错误。。。

请先确定你的代理IP可用,然后调试看看,返回那个说明是通信成功的,代理可用了,如果代理不可用肯定是404,这说明是你参数的问题
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-26 20:32

© 2014-2021

快速回复 返回顶部 返回列表