您的位置:首页 > 理论基础 > 计算机网络

HttpWebRequest GET方式提交Asp.net表单.doc COOKIE

2012-02-19 15:38 801 查看
原文链接:http://blog.csdn.net/an3gsonnzhy/article/details/3183722

本想做个提取某页一些数据的小程序.以前也看过些爬虫方面的知识.可这次这个网页的内容需要登录后才能提取.这下把我有点难住了.

问题:

1. 是否我在浏览器登录后在程序中访问就等于登录了呢?

于是经过测试, 失败告终!

猜想原因:可能COOKIE只与特定浏览器关联,由于我是在Console中通过代码访问页面,所以不能关联到浏览器的COOKIE

于是上网查了些关于HttpWebRequest提交表单的内容,经过很多次测试终于成功!(可能自己网络方面的基础不是太好,所以才这么费劲)

下面就介绍下http方面的一些知识吧.(由自己测试整理)

一个人通过浏览器输入网址访问一个网站其实是向网站服务器发送了一个http请求.内容如下:

GET /my.html HTTP/1.1

Host: www.myweb.com

Accept: */*

User-Agent: Mozilla/4.0 (compatible; MSIE.6.0; Windows NT 5.1)

Pragma: no-cache

Cache-Control: no-cache

Connection: close


[空行]

此请求说明 通过GET方式请求服务器上的页面my.html,协议版本是1.1,黑体部分被成为http头部

当Web服务器接收到该请求时,服务器检查所请求的资源是否有效,且是否有相应的权限。如果没有问题,则服务器会传回类似如下的http响应信息:

HTTP/1.1 200 OK

Server: Microsoft-IIS/5.0

Date: Thursday, March 31, 2005 17:15:23 GMT

Content-Type: text/html

Content-Length: 88

[空行]

<html>

<head>

<title>my.html</title>

</head>

<body>

</body>

</html>

下面说下GET方式和POST方式的区别:

通过GET方式提交表单会把表单中的内容都附加到url后面,如下

get1.html?text1=dfgdf&text2=dfg&button=%CC%E1%BD%BB%B2%E9%D1%AF%C4%DA%C8%DD(button为提交按钮名)

其中不但包括各种input型元素的内容还包括提交按钮的值!

而POST方式是先发送一个http请求,而后再发送一个参数数据包(通过sniffer查看)

POST /form.html HTTP/1.1

Content-Type: application/x-www-form-urlencoded
Content-Length: 6
[空行]
text1=dfgdf&text2=dfg&button=%CC%E1%BD%BB%B2%E9%D1%AF%C4%DA%C8%DD

请注意是通过两次发送的!

而在asp.net页面中还要附加_VIEWSTATE和_EVENTVALIDATION,否则请求会失败.

总而言之:GET方式发送一个请求同时把参数传过去.

POST方式是通过两次请求发送,一次发送http请求,一次发送参数(注意发送数据时要转换为字节类型)

下面是代码:(通过GET方式,POST方式如述原理代码略)

测试网站共有两个页

1. Login.aspx 登录后建立COOKIE

2. Default.aspx 测试是否建立COOKIE

原理:通过程序模拟登录,然后访问Default.aspx测试是否登录成功!

注意点:

1. 通过post发送的数据要转换为字节类型

2. 参数要转换为url编码(只需转换自己添加的参数,表单自己添加的参数不用转换)

using System;

using System.Collections.Generic;

using System.Text;

using System.Net;

using System.IO;

namespace GetTop10

{

class Program

{

static void Main(string[] args)

{

//关联COOKIE

CookieContainer cookieContainer = new CookieContainer();

//先请求 Login.aspx页并且提交POST数据,模拟登录

HttpWebRequest login = (HttpWebRequest)WebRequest.Create("http://localhost/Login.aspx");

login.Method = "POST";

login.KeepAlive = false;

//接收返回的页面

HttpWebResponse responseLogin = login.GetResponse() as HttpWebResponse;

System.IO.Stream responseStream = responseLogin.GetResponseStream();

System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);

string srcString = reader.ReadToEnd();

// 获取页面的 VeiwState

string viewStateFlag = "id=/"__VIEWSTATE/" value=/"";

int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;

int j = srcString.IndexOf("/"", i);

string viewState = srcString.Substring(i, j - i);

// 获取页面的 EventValidation

string eventValidationFlag = "id=/"__EVENTVALIDATION/" value=/"";

i = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length;

j = srcString.IndexOf("/"", i);

string eventValidation = srcString.Substring(i, j - i);

//转换为URL编码

viewState = System.Uri.EscapeDataString(viewState);

eventValidation = System.Uri.EscapeDataString(eventValidation);

string formatString =

"TextBox1={0}&TextBox2={1}&Button1={2}&__VIEWSTATE={3}&__EVENTVALIDATION={4}";

string postString =

string.Format(formatString, "song", "song", "登录", viewState, eventValidation);

// 发送的数据必须转换为字节类型

byte[] postData = Encoding.ASCII.GetBytes(postString);

// 通过GET方式登录

login = WebRequest.Create("http://127.0.0.1/Login.aspx?"+postString) as HttpWebRequest;

login.Method = "GET";

login.KeepAlive = false;

login.ContentType = "application/x-www-form-urlencoded";

login.CookieContainer = cookieContainer; //关联建立的COOKIE

// 接收返回的页面

responseLogin = login.GetResponse() as HttpWebResponse;

responseStream = responseLogin.GetResponseStream();

reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding("utf-8"));

srcString = reader.ReadToEnd();

// 访问Default.aspx页面测试是否登录成功!

string URI = "http://127.0.0.1/Default.aspx";

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URI);

req.Method = "GET";

req.KeepAlive = false;

req.CookieContainer = cookieContainer;

// 接收返回的页面

HttpWebResponse res = req.GetResponse() as HttpWebResponse;

Stream rs = res.GetResponseStream();

reader = new System.IO.StreamReader(rs, Encoding.UTF8);

srcString = reader.ReadToEnd();

Console.WriteLine(cookieContainer.Count);

Console.WriteLine(srcString);

Console.ReadLine();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐