HttpWebRequest类的相关知识

HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。

不要使用 HttpWebRequest 构造函数。使用 System.Net.WebRequest.Create 方法初始化新的 HttpWebRequest 对象。如果统一资源标识符 (URI) 的方案是 http:// 或 https://,则 Create 返回 HttpWebRequest 对象。

GetResponse 方法向 RequestUri 属性中指定的资源发出同步请求并返回包含该响应的 HttpWebResponse。可以使用 BeginGetResponse 和 EndGetResponse 方法对资源发出异步请求。

当要向资源发送数据时,GetRequestStream 方法返回用于发送数据的 Stream 对象。BeginGetRequestStream 和 EndGetRequestStream 方法提供对发送数据流的异步访问。

对于使用 HttpWebRequest 的客户端验证身份,客户端证书必须安装在当前用户的“我的证书”存储区中。

如果在访问资源时发生错误,则 HttpWebRequest 类将引发 WebExceptionWebException.Status 属性包含指示错误源的 WebExceptionStatus 值。当 WebException.Status为 WebExceptionStatus.ProtocolError 时,Response 属性包含从资源接收的 HttpWebResponse

HttpWebRequest 将发送到 Internet 资源的公共 HTTP 标头值公开为属性,由方法或系统设置;下表包含完整列表。可以将 Headers 属性中的其他标头设置为名称/值对。注意,服务器和缓存在请求期间可能会更改或添加标头。

个人理解,HttpWebRequest类可以帮助我们不需要通过浏览器就可以获取我们所需要的页面内容,主要表现在如自动登录,自动发布,或者一些基于Web的软件外挂。

运用HttpWebRequest类,总体可以概括成以下几步:
第一步找出需要提交的数据;第二步访问该页面,取出页面的一些动态信息(如:隐藏域,验证码等信息);第三步组成Post的数据并发送请求;第四步分析返回的HTML并显示结果

首先,让我们了解一下表单提交数据的两种形式:

        FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是“application/x-www-form-urlencoded”,后跟页面编码格式,如:UTF-8,GB2312等。

然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。

在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。

         Browser端<form>表单的ENCTYPE属性值为multipart/form-data,它告诉我们传输的数据要用到多媒体传输协议,由于多媒体传输的都是大量的数据,所以规定上传文件必须是post方法,<input>的type属性必须是file。

我们再了解一下,通过哪些工具可以截取我们向页面提交的数据

下面以http:www.toocle.com这个网站的登录为例:在首页,输入用户名和密码,然后登录。

这里是用IE HTTPAnalyzer V3这个工具抓的包

这里介绍几款网络数据抓包工具:

1.IE HTTPAnalyzer V3

2.HttpWatch

3.Fiddler

知道了要向页面提交哪些数据之后,就要来构造我们的POST数据

如:上面的示例构造数据流应该是:“returl=&username=gangx6&password=gangx20&f1=Login&f=login1”,数据流的格式,是以参数名=参数值然后跟连接符号&

 //预览网址
string preUrl = "http://www.toocle.com/";
//处理网址
string actionUrl = "http://www.toocle.com/member/index.cgi";
string userName = textBox1.Text.ToString();
string userPwd = textBox2.Text.ToString();
//Post数据流
string content = "returl=&username=" + userName + "&password=" + userPwd + "&f1=Login&f=login1";

然后对HttpWebRequest类的其他成员赋值:

     httpRequest = (HttpWebRequest)WebRequest.Create(actionUrl);
//允许跳转
httpRequest.AllowAutoRedirect = true;
//是否保持连接
httpRequest.KeepAlive = true;
//设置 Accept HTTP 标头的值
httpRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash"
//设置 User-agentHTTP 标头的值,主要是浏览器类型
httpRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0)"
//表单提交类型,上面有提到
httpRequest.ContentType = "application/x-www-form-urlencoded";
//数据是POST上去的,当然还有GET方式
httpRequest.Method = "POST";
//设置 RefererHTTP 标头的值,其实也就是来源了,有的网站禁止从外部提交数据就是通过它来判断的
httpRequest.Referer = preUrl;

最后,获取返回的流Response,然后我们再作其他处理。

      //返回来自 Internet 资源的响应
HttpWebResponse response = (HttpWebResponse)httpRequest.GetResponse();
//将响应放到Stream里
Stream responseStream = response.GetResponseStream();
StreamReader responseReader = new StreamReader(responseStream)
//得到我们要的结果
result = responseReader.ReadToEnd();

posted @ 2012-11-21 15:59  DaBan  阅读(534)  评论(0编辑  收藏  举报