紧急~~!!一个网络编程的问题~!
最近工作上遇到一个很奇怪的问题,尽管看似简单,但是确实让我百思不得其解。问题如下:我现在需要对Internet上的地址链接发送HTTP请求,使用GET方法,获得完整的应答内容(这好像是一个最最基本的网络编程)。
我使用的是C#里的WebRequest和WebResponse两个类来完成的这项工作,代码如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
namespace BodyCheck
{
class Run
{
static void Main(string[] args)
{
string body = "initial";
WebRequest request = (HttpWebRequest)WebRequest.Create("http://itbbs.pconline.com.cn/mobile/10157820_1.html");
request.Method = "GET";
request.Timeout = 5000;
WebResponse response = (HttpWebResponse)request.GetResponse();
Encoding encode = Encoding.Default;
Stream st = response.GetResponseStream();
StreamReader sr = new StreamReader(st, encode);
body = sr.ReadToEnd();
Console.WriteLine();
if (body == " ")
{
Console.WriteLine("it's space");
}
Console.ReadLine();
}
}
}
这应该是一段很典型的代码,请注意我的这个被请求链接URL:“http://itbbs.pconline.com.cn/mobile/10157820_1.html”,
这个链接能够用浏览器正常打开(IE和Firefox都没问题),可以显示正常的内容,可是,用我上述代码,得到的的应答,body里面却似乎什么也没有,
我尝试看了一下,body.Length,body的长度是1,我很好奇,body里面到底是什么,所以我就用了上述的一个if来验证,
惊奇地发现,body里面竟然只有一个空格。
而且,我发现,以下链接,用我上面的代码去请求,有同样的症状,会产生同样的结果——body就是一个空格,其他什么都没有:
http://www.xgrb.cn/bbs/read-htm-tid-441782.html
http://www.luobo.cc/read.php?tid=4857626
http://cafe.pconline.com.cn/9996830.html
http://www.xtzj.com/read-htm-tid-336558.html
http://www.in9.cn/read.php?tid=325653
等等等等……
好多数量的网站~~!!!!!
为什么会这样?难道是我对于HTTP理解有误?还是对于C#作用HTTP的原理的错误理解导致?我百思不得其解。
事情比较紧急!!实在没有办法,希望能得到大家的帮助。
不胜感谢~~!!
--------------------编程问答-------------------- 应该是所有连接关于这个连接的都连接上了吧。我截取网址也出现这种情况。
学习了 --------------------编程问答-------------------- 这样的问题应该属于连接方面的,本人学习中 --------------------编程问答--------------------
我自己来回答我自己提的问题吧~~!!(^_^)
问题已经在昨天找到,并且解决。
我现在把问题原因和解决方法告知大家,和大家共同学习,及和我遇到过共同问题的弟兄姐妹们参考。
顺便说明一下,我使用的是.NET Framework 3.5 SP 1。
使用HttpWebRequest类创建对象的时候,例如:HttpWebRequest request = ...;
此时,我所定义的request实例,其header部分,被C#默认初始化为,只有两个header值,即:
Host: ... (被请求Web服务器主机)
Proxy-Connection: ... (代理连接情况状态,例如“Keep-Alive”等)
很多网站的Web服务器,在收到上述包含如此简单的2个header的HTTP请求后,就已经能够给出正确的应答了。
但是有相当数量的网站,对于可能不是浏览器发来的HTTP请求,不会做出正确的回应,应答部分只给出空白。(这就是我遇到的问题所在了)。
因为一般的浏览器,例如IE、Firefox或是Safari等,它们在发送HTTP请求的时候,header部分的信息是非常丰富的,例如包含了“Accept”媒体类型值、“Accept-Encoding”值、“Accept-Language”值、“User-Agent”值等等。
所以,这个问题的一个解决方法就是,在编写发送请求代码的时候,如果没有特殊的需求,仅仅只是想得到对方的应答,
那么就要确保你发送的请求,看起来像个浏览器的发送请求。
至少,在C#默认的2个header的基础之上,加上“User-Agent”值,来指明系统和浏览器类型。
例如,加上一句:
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
整个解决方法的完整代码如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
namespace BodyCheck
{
class Run
{
static void Main(string[] args)
{
string body = "initial";
//使用HttpWebRequest类来建立请求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://cafe.pconline.com.cn/10154623.html");
/*
* 这是最关键的一句,也是导致问题的所在:
* Internet上很多Web服务器,对于可能不是浏览器发出的HTTP请求,会给出空白的应答,
* 此帖就是一个典型的例子。
* 所以此句的作用,就是在我们自己的HTTP请求header部分,加上“User-Agent”值,来明确请求方兼容的系统,和浏览器类型,
* 目的是使对方Web服务器能够根据我们的“User-Agent”值指示的兼容描述,给出正确的应答。
*/
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
request.Method = "GET";
request.Timeout = 60000; //注意:此处Timeout设置过小,可能会导致请求失败,毕竟很多服务器应答延时很长
//获得对方服务器应答
WebResponse response = (HttpWebResponse)request.GetResponse();
//获得对方服务器传来应答的流,并且最终读取成字符串
Encoding encode = Encoding.Default;
Stream st = response.GetResponseStream();
StreamReader sr = new StreamReader(st, encode);
body = sr.ReadToEnd();
Console.WriteLine(request.Headers.ToString()); //输出请求的Header部分
Console.WriteLine(body); //输出应答字符串内容
Console.ReadLine();
}
}
}
至此,就可以得到正常的应答内容了!!
顺便说一下,想要了解你的电脑,和整个互联网交互详细过程的朋友(尤其是浏览器与Internet交互全过程),
可以使用Fiddler这个软件。
这个软件确实很强大,可以监测到你的电脑,和整个网络交互的所有细节。
关于Fiddler的使用方法,这里就不再赘述了,
大家可以去网上搜索它使用方法,或是参阅相关文档。
这里只给出Fiddler的下载地址:
http://www.fiddler2.com/fiddler2/
希望上面的东西对大家能够有所帮助~~!!
--------------------编程问答-------------------- 不错,学习了 --------------------编程问答-------------------- 太好了 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 学习
补充:.NET技术 , .NET Framework