代码:
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) 服务器不可用。
这到底是什么原因呢,请各位高手帮帮忙!
你先写个Console程序放在服务器那台机器上,看看你的代码能否正确执行。
再然后呢?
@l284209006: 结果呢?
@Launcher: 结果是不行
@l284209006: 你用Fiddler抓包比对下,在你机器上发出的请求和服务器发出的请求有何差别。
@Launcher: 抓包发现本地上和服务器上的请求结果不一样,在服务器上抓包根本就找不到请求的url地址,还出现了好多把锁头。那么这样的问题又该如何解决呢?
@l284209006: 你可以把Fiddler设置为代理,然后在你的代码中使用http代理来发请求,这样你的应用程序发出的http请求就会被Fiddler抓取到。加锁的请求是验证根证书用的。
@Launcher: 都设置了,在本地可以抓到Https请求的数据了,在服务器上还是抓不到。而且现在的提示已经改变了。异常信息:基础连接已经关闭: 接收时发生错误。
@l284209006: 你可以考虑先访问下该页面能否成功,http://www.zol.com.cn,然后尝试访问别的 使用 https 的网站试试。你现在要确定的问题是你的服务器能够正常访问某个域名,并且从你的服务器到该域名的链路是畅通的。HTTP 503的常见原因是服务器负载过高所致,至于是链路中哪台服务器负载过高,需要通过测试才知道。
@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: 你可以在服务器的IE中测试下你要访问的该网址,然后记下请求的Header,在你的代码中确保这些headers和IE发出去的一样。
@Launcher: 按照你的指点这么做了,刚开始是访问成功了,可不知道为什么过了一会又出现503了!
@l284209006: 如果能访问成功,那就说明代码没有问题了。如果间隙性出现503错误,那么如果不是服务器因为负载过高或请求过于频繁拒绝了请求,应该就是IIS对一段时间内本地端口号数量的限制。
@Launcher: 我现在认为应该是请求过于频繁被对方防火墙屏蔽了!假如是这样的话,有办法解决不,大专家?
@l284209006: 如果是这样的话,你可以使用不同的代理来完成你的请求,或者是否在请求中添加随机数来骗过服务器。
@Launcher: 好咧,真的那样。现在又可以了。感谢大专家的热心帮助。你说的使用不通的代理或者添加什么随机数我不太懂,我现在就通过线程来让程序访问一次后先停十秒再访问,这样应该可以避免!不过假如您有空的话可以教教我具体如何弄你所说的方法!谢谢了哈!
@l284209006: 如果服务器是通过请求中的某个值来决定是否拒绝的话,就可以通过自动修改该值来伪造成不同的请求,如果不是的话,就只能通过更改发起请求的IP来欺骗。一是找到网上免费的代理,然后在请求的时候指定WebProxy来完成请求,拒绝后更换一个新的WebProxy,然后来回切换不同的WebProxy。
@Launcher: 明白,谢了!
@Launcher: 这方法用上了,不能完全避免,只是被屏蔽的概率小了很多。
http://www.cnblogs.com/daohuen/archive/2008/09/28/1301468.html
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
这代码原来就已经有在请求之前了的!
是不是服务器没有开放出站请求?
http类型请求都可以了,确定已经开放了