首页 新闻 会员 周边 捐助

在本地HttpWebRequest 请求https开头的网站可以请求成功,但发布到服务器上就远程服务器返回错误: (503) 服

0
悬赏园豆:40 [已解决问题] 解决于 2012-09-05 20:37

代码:

request = WebRequest.Create(url) as HttpWebRequest; 
request.ProtocolVersion = HttpVersion.Version10;

HttpWebResponse httpWebResponse = (HttpWebResponse)request.GetResponse();
Stream responseStream = httpWebResponse.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream, requestEncoding == null ? Encoding.UTF8 : requestEncoding);

此代码在本地IIS是请求成功并返回请求页面内容了的。

问题是上传服务器后就错误了,错误提示:远程服务器返回错误: (503) 服务器不可用。

这到底是什么原因呢,请各位高手帮帮忙!

< >
分享
最佳答案
0

你先写个Console程序放在服务器那台机器上,看看你的代码能否正确执行。

收获园豆:40
Launcher | 高人七级 |园豆:45050 | 2012-09-04 15:54

再然后呢?

l284209006 | 园豆:116 (初学一级) | 2012-09-04 16:33

@l284209006: 结果呢?

Launcher | 园豆:45050 (高人七级) | 2012-09-04 16:42

@Launcher: 结果是不行

l284209006 | 园豆:116 (初学一级) | 2012-09-04 17:05

@l284209006: 你用Fiddler抓包比对下,在你机器上发出的请求和服务器发出的请求有何差别。

Launcher | 园豆:45050 (高人七级) | 2012-09-05 09:12

@Launcher: 抓包发现本地上和服务器上的请求结果不一样,在服务器上抓包根本就找不到请求的url地址,还出现了好多把锁头。那么这样的问题又该如何解决呢?

l284209006 | 园豆:116 (初学一级) | 2012-09-05 10:06

@l284209006: 你可以把Fiddler设置为代理,然后在你的代码中使用http代理来发请求,这样你的应用程序发出的http请求就会被Fiddler抓取到。加锁的请求是验证根证书用的。

Launcher | 园豆:45050 (高人七级) | 2012-09-05 10:58

@Launcher: 都设置了,在本地可以抓到Https请求的数据了,在服务器上还是抓不到。而且现在的提示已经改变了。异常信息:基础连接已经关闭: 接收时发生错误。

l284209006 | 园豆:116 (初学一级) | 2012-09-05 11:39

@l284209006: 你可以考虑先访问下该页面能否成功,http://www.zol.com.cn,然后尝试访问别的 使用 https 的网站试试。你现在要确定的问题是你的服务器能够正常访问某个域名,并且从你的服务器到该域名的链路是畅通的。HTTP 503的常见原因是服务器负载过高所致,至于是链路中哪台服务器负载过高,需要通过测试才知道。

Launcher | 园豆:45050 (高人七级) | 2012-09-05 11:53

@Launcher: 我确定其它http类型的可以了,我现在想要访问的是谷歌的,我访问的网址是这样的:https://www.google.com.hk/search?q=%e9%ab%98%e6%b8%a9%e6%a0%87%e7%ad%be&hl=en&newwindow=1&safe=strict&site=webhp&prmd=imvns&ei=yXdFUPi1M4WUiAf8voHwAw&start=0&sa=N&biw=1920&bih=881

其中还包含了一些参数的,因为谷歌对某些敏感词的阻断,所以我考虑用https的。这种类型在我本机IIS测试时可行的,问题就是到服务器上就报错了!我都认为是不是和服务器上的某些安全设置有关了。

l284209006 | 园豆:116 (初学一级) | 2012-09-05 14:30

@l284209006: 你可以在服务器的IE中测试下你要访问的该网址,然后记下请求的Header,在你的代码中确保这些headers和IE发出去的一样。

Launcher | 园豆:45050 (高人七级) | 2012-09-05 14:42

@Launcher: 按照你的指点这么做了,刚开始是访问成功了,可不知道为什么过了一会又出现503了!

l284209006 | 园豆:116 (初学一级) | 2012-09-05 16:15

@l284209006: 如果能访问成功,那就说明代码没有问题了。如果间隙性出现503错误,那么如果不是服务器因为负载过高或请求过于频繁拒绝了请求,应该就是IIS对一段时间内本地端口号数量的限制。

Launcher | 园豆:45050 (高人七级) | 2012-09-05 17:14

@Launcher: 我现在认为应该是请求过于频繁被对方防火墙屏蔽了!假如是这样的话,有办法解决不,大专家?

l284209006 | 园豆:116 (初学一级) | 2012-09-05 17:22

@l284209006: 如果是这样的话,你可以使用不同的代理来完成你的请求,或者是否在请求中添加随机数来骗过服务器。

Launcher | 园豆:45050 (高人七级) | 2012-09-05 17:33

@Launcher: 好咧,真的那样。现在又可以了。感谢大专家的热心帮助。你说的使用不通的代理或者添加什么随机数我不太懂,我现在就通过线程来让程序访问一次后先停十秒再访问,这样应该可以避免!不过假如您有空的话可以教教我具体如何弄你所说的方法!谢谢了哈!

l284209006 | 园豆:116 (初学一级) | 2012-09-05 17:58

@l284209006: 如果服务器是通过请求中的某个值来决定是否拒绝的话,就可以通过自动修改该值来伪造成不同的请求,如果不是的话,就只能通过更改发起请求的IP来欺骗。一是找到网上免费的代理,然后在请求的时候指定WebProxy来完成请求,拒绝后更换一个新的WebProxy,然后来回切换不同的WebProxy。

Launcher | 园豆:45050 (高人七级) | 2012-09-05 18:25

@Launcher: 明白,谢了!

l284209006 | 园豆:116 (初学一级) | 2012-09-05 20:37

@Launcher: 这方法用上了,不能完全避免,只是被屏蔽的概率小了很多。

l284209006 | 园豆:116 (初学一级) | 2012-09-06 15:02
其他回答(3)
0

http://www.cnblogs.com/daohuen/archive/2008/09/28/1301468.html

田林九村 | 园豆:2367 (老鸟四级) | 2012-09-04 15:58

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);

这代码原来就已经有在请求之前了的!

支持(0) 反对(0) l284209006 | 园豆:116 (初学一级) | 2012-09-04 16:32
0

是不是服务器没有开放出站请求?

向往-SONG | 园豆:4853 (老鸟四级) | 2012-09-04 16:02

http类型请求都可以了,确定已经开放了

支持(0) 反对(0) l284209006 | 园豆:116 (初学一级) | 2012-09-04 16:15
0
az235 | 园豆:8483 (大侠五级) | 2012-09-04 18:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册