获取WebBrowser全cookie 和 httpWebRequest 异步获取页面数据

获取WebBrowser全cookie

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref int pcchCookieData, int dwFlags, object lpReserved);
//取出Cookie,当登录后才能取
private static string GetCookieString(string url)
{
// Determine the size of the cookie
int datasize = 256;
StringBuilder cookieData = new StringBuilder(datasize);
if (!InternetGetCookieEx(url, null, cookieData, ref datasize, 0x00002000, null))
{
if (datasize < 0)
return null;
// Allocate stringbuilder large enough to hold the cookie
cookieData = new StringBuilder(datasize);
if (!InternetGetCookieEx(url, null, cookieData, ref datasize, 0x00002000, null))
return null;
}
return cookieData.ToString();
}

直接调用GetCookieString方法获取cookie

httpWebRequest 异步获取页面数据

private static ManualResetEvent allDone = new ManualResetEvent(false);

private const int BUFFER_SIZE = 1024;
public static void AsyncResponse(string url, CookieCollection cookieCollection)
{
// 从命令行获取 URI
Uri HttpSite = new Uri(url);

// 创建请求对象
HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(HttpSite);
wreq.Method = "GET";

if (cookieCollection != null)
{
wreq.CookieContainer = new CookieContainer();
wreq.CookieContainer.Add(cookieCollection);
}
// 创建状态对象
RequestState rs = new RequestState();

// 将请求添加到状态,以便它可以被来回传递
rs.Request = wreq;

// 发出异步请求
IAsyncResult r = (IAsyncResult)wreq.BeginGetResponse(new AsyncCallback(RespCallback), rs);

// 将 ManualResetEvent 设置为 Wait,
// 以便在调用回调前,应用程序不退出
allDone.WaitOne();

}

private static void RespCallback(IAsyncResult ar)
{
// 从异步结果获取 RequestState 对象
RequestState rs = (RequestState)ar.AsyncState;

// 从 RequestState 获取 HttpWebRequest
HttpWebRequest req = rs.Request;

// 调用 EndGetResponse 生成 HttpWebResponse 对象
// 该对象来自上面发出的请求
HttpWebResponse resp = (HttpWebResponse)req.EndGetResponse(ar);

// 既然我们拥有了响应,就该从
// 响应流开始读取数据了
Stream ResponseStream = resp.GetResponseStream();

// 该读取操作也使用异步完成,所以我们
// 将要以 RequestState 存储流
rs.ResponseStream = ResponseStream;

// 请注意,rs.BufferRead 被传入到 BeginRead。
// 这是数据将被读入的位置。
IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
}

private static void ReadCallBack(IAsyncResult asyncResult)
{
// 从 asyncresult 获取 RequestState 对象
RequestState rs = (RequestState)asyncResult.AsyncState;

// 取出在 RespCallback 中设置的 ResponseStream
Stream responseStream = rs.ResponseStream;

// 此时 rs.BufferRead 中应该有一些数据。
// 读取操作将告诉我们那里是否有数据
int read = responseStream.EndRead(asyncResult);

if (read > 0)
{
// 准备 Char 数组缓冲区,用于向 Unicode 转换
Char[] charBuffer = new Char[BUFFER_SIZE];

// 将字节流转换为 Char 数组,然后转换为字符串
// len 显示多少字符被转换为 Unicode

int len = rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0);
String str = new String(charBuffer, 0, len);

// 将最近读取的数据追加到 RequestData stringbuilder 对象中,
// 该对象包含在 RequestState 中
rs.RequestData.Append(str);

// 现在发出另一个异步调用,读取更多的数据
// 请注意,将不断调用此过程,直到
// responseStream.EndRead 返回 -1
IAsyncResult ar = responseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
}
else
{
if (rs.RequestData.Length > 1)
{
// 所有数据都已被读取,因此将其显示到控制台
string strContent;
strContent = rs.RequestData.ToString();
Console.WriteLine(strContent);
}

// 关闭响应流
responseStream.Close();

// 设置 ManualResetEvent,以便主线程可以退出
allDone.Set();
}
return;
}

public class RequestState
{
const int BUFFER_SIZE = 1024;
public StringBuilder RequestData;
public byte[] BufferRead;
public HttpWebRequest Request;
public Stream ResponseStream;
// 创建适当编码类型的解码器
public Decoder StreamDecode = Encoding.UTF8.GetDecoder();

public RequestState()
{
BufferRead = new byte[BUFFER_SIZE];
RequestData = new StringBuilder("");
Request = null;
ResponseStream = null;
}
}

时间: 2024-12-23 18:22:46

获取WebBrowser全cookie 和 httpWebRequest 异步获取页面数据的相关文章

通过Jquery异步获取股票实时数据

最近朋友让我帮他做个异步获取数据的程序,暂时服务器什么都没有,所以我就想先拿股票数据打个框架,方便后续开发和移植等事情 代码如下: <!-- 说明:股票看盘 作者:黑桃A 时间:2014-04-14 参考: http://www.lxway.com/240649562.htm http://www.lxway.com/946486042.htm http://www.365mini.com/page/jquery_getscript.htm http://blog.csdn.net/xxjoy_

cookie的设置和获取

1.Cookie设置 每个cookie都是一个名/值对(key=value)格式的字符串 例如: document.cookie="user1=YY"; 如果要改变一个cookie的值,只需重新赋值 例如: document.cookie="user1=QQ"; 封装获取cookie的函数 function setCookie(user,value,day){ var dates=new Date(); dates.setDate(dates.getDate()+d

cookie的设置、获取以及删除

首先介绍一下cookie的基本信息: cookie是以域为单位的,它必须放在服务器的的环境下,但是cookie的容量小,只有4kb,并且也不安全,还有入股cookie的名字相同,会修改或者覆盖原来的值,如果名字不同,会添加一条cookie: 接下来再和大家说一声关于获取cookie: 获取到cookie的格式都是字符串: 父级种下的cookie,子级可以获取到:子级种下的cookie,父级获取不到: 还有就是cookie的path:可以设置,一般都是设置到 '/' 根目录下: 好了,下面就是我封

Swift - 异步获取网络数据封装类

使用NSURLConnection.sendAsynchronousRequest()可以采用异步获取的方式取得数据.下面通过对数据获取类进行封装,演示如何进行数据请求与接收. 1,HttpController.swift (数据获取封装类,结果处理协议) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import UIKit //自定义http协议 protocol HttpProto

Validform和aui2.0结合使用的表单自定义验证提示和列表页异步获取数据Demo

二.添加自定义验证演示       Validform验证提示大多都是在输入框或下拉框的右边或下面.感觉就是不美观,特别是表单字段少的时候,这种在相应对象旁边的提示就没必要了,      它会给人一种不友好的感觉(只是自己的感觉).所以下面写了三种添加演示,希望大家能给出建议,以免下次用起来纠结,不知道用哪种好.        表单验证插件是我们经常使用的Validform_v5.3.2_min.js.先上添加1演示的表单验证js代码,这里我设置了点击提交按钮后才验证.其他添加演示的区别不大,详

JSON异步获取网络数据

//定义一个方法来获取网络数据,接受参数为网址 func onSearch(url: String){ //定义一个NSURL var nsUrl: NSURL = NSURL(string: url)! //定义一个NSURLRequest var request: NSURLRequest = NSURLRequest(URL: nsUrl) //异步获取数据 NSURLConnection.sendAsynchronousRequest(request, queue: NSOperatio

HDFS 读取、写入、遍历目录获取文件全路径

1.从HDFS中读取数据 Configuration conf = getConf(); Path path = new Path(pathstr); FileSystem fs = FileSystem.get(conf); FSDataInputStream fsin= fs.open(path ); BufferedReader br =null; String line ; try{ br = new BufferedReader(new InputStreamReader(fsin))

获取和设置cookie的方法(5种)

//--------------------------11111111111 var createCookie = function (a, b, c, d) { var d = d ? d : "/"; if (c) { var e = new Date; e.setTime(e.getTime() + 24 * c * 60 * 60 * 1e3); var f = "; expires=" + e.toGMTString() } else var f = &

js 添加、获取、删除 cookie

// 保存 Cookie function setCookie(name, value) { expires = new Date(); expires.setTime(expires.getTime() + (1000 * 86400 * 365)); document.cookie = name + "=" + escape(value) + ";"; } // 获取 Cookie function getCookie(name) { cookie_name =