一个可同步调用异步执行的HttpWebRequest类
来源:互联网 发布:淘宝开团怎么抢 编辑:程序博客网 时间:2024/06/08 05:23
下面这个例子是对MSDN上异步HttpWebRequest例子修改,下载指定URL的页面,可同步调用,调用方法如下:
string str=MyHttp.GetPage("http://www.sohu.com") ;
public class MyHttp
{
public static ManualResetEvent allDone = new ManualResetEvent(false);
const int BUFFER_SIZE = 1024;
public static string GetPage(string url)
{
HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(url);
wreq.UserAgent = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; Alexa Toolbar)";
wreq.Headers.Add("accept-language", "zh-cn");
wreq.Headers.Add("accept-encoding", "gzip, deflate");
RequestState rs = new RequestState();
rs.Request = wreq;
IAsyncResult r = (IAsyncResult)wreq.BeginGetResponse(
new AsyncCallback(RespCallback), rs);
allDone.WaitOne();
allDone.Reset();
return rs.RequestData.ToString();
}
private static void RespCallback(IAsyncResult ar)
{
RequestState rs = (RequestState)ar.AsyncState;
WebRequest req = rs.Request;
WebResponse resp = null;
try
{
resp = req.EndGetResponse(ar);
resp.Headers.Add("accept-language", "zh-cn");
resp.Headers.Add("accept-encoding", "gzip, deflate");
}
catch (Exception ex)
{
allDone.Set();
return;
}
Stream ResponseStream = resp.GetResponseStream();
rs.ResponseStream = ResponseStream;
IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0,
BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
}
private static void ReadCallBack(IAsyncResult asyncResult)
{
// Get the RequestState object from AsyncResult.
RequestState rs = (RequestState)asyncResult.AsyncState;
// Retrieve the ResponseStream that was set in RespCallback.
Stream responseStream = rs.ResponseStream;
// Read rs.BufferRead to verify that it contains data.
int read = responseStream.EndRead(asyncResult);
if (read > 0)
{
// Prepare a Char array buffer for converting to Unicode.
Char[] charBuffer = new Char[BUFFER_SIZE];
// Convert byte stream to Char array and then to String.
// len contains the number of characters converted to Unicode.
int len =
rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0);
String str = new String(charBuffer, 0, len);
// Append the recently read data to the RequestData stringbuilder
// object contained in RequestState.
rs.RequestData.Append(
Encoding.Default.GetString(rs.BufferRead, 0, read));
// Continue reading data until
// responseStream.EndRead returns –1.
IAsyncResult ar = responseStream.BeginRead(
rs.BufferRead, 0, BUFFER_SIZE,
new AsyncCallback(ReadCallBack), rs);
}
else
{
// Close down the response stream.
responseStream.Close();
// Set the ManualResetEvent so the main thread can exit.
allDone.Set();
}
return;
}
}
public class RequestState
{
const int BufferSize = 1024;
public StringBuilder RequestData;
public byte[] BufferRead;
public WebRequest Request;
public WebResponse resp;
public Stream ResponseStream;
// Create Decoder for appropriate enconding type.
public Decoder StreamDecode = Encoding.Default.GetDecoder();
public RequestState()
{
BufferRead = new byte[BufferSize];
RequestData = new StringBuilder(String.Empty);
Request = null;
resp = null;
ResponseStream = null;
}
}
- 一个可同步调用异步执行的HttpWebRequest类
- HttpWebRequest 的一个 异步封装
- HttpWebRequest 的异步封装
- NSNotification的同步执行、异步执行
- BAPI的同步异步调用
- 委托的异步调用和同步调用
- 同步调用、异步调用
- 同步和异步(程序执行的同步和异步,传输的同步和异步)
- 代码的同步和异步执行
- jquery ajax 同步异步的执行
- jquery ajax 同步异步的执行
- jquery ajax 同步异步的执行
- jquery ajax 同步异步的执行
- jquery ajax 同步异步的执行
- jquery ajax 同步异步的执行
- jquery ajax 同步异步的执行
- jquery ajax 同步异步的执行
- jquery ajax 同步异步的执行
- 浅析C#的事件处理和自定义事件!
- 学习笔记-Geodatabase数据类型
- PHP程序自动执行
- 如何用VC++开发读取网卡MAC地址的程序
- 利用osworkflow实现业务流程
- 一个可同步调用异步执行的HttpWebRequest类
- 常用的挂马代码
- 一个一年工作经验的java工程师从工作初到今天的所有收藏的学习java的网站(有些很经典)
- C#发送Email邮件方法总结(.net2.0)
- 正确地做事与做正确的事同样重要
- 在SQL Server中快速删除重复记录
- [转]关于P2P应用中NAT穿透技术的资料
- 读写配置文件app.config
- [转] P2P 之 UDP穿透NAT的原理与实现(附源代码)