当前位置:编程学习 > C#/ASP.NET >>

紧急~~!!一个网络编程的问题~!

最近工作上遇到一个很奇怪的问题,尽管看似简单,但是确实让我百思不得其解。问题如下:
 
我现在需要对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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,