C# 刚写的 HttpRequsetResponse 类,异步、事件
private void button1_Click(object sender, System.EventArgs e)
{
HttpRequestResponse xx = new HttpRequestResponse();
xx.DataArrival += new DataArrivalEventHandler(xx_DataArrival);
xx.SendRequest("http://www.triaton.com.cn/dotnet/tree/index.asp","userid=老","Post");
xx.SendRequest("http://www.triaton.com.cn/dotnet/tree/index.asp","userid=老","get");
}
private void xx_DataArrival(object sender, DataArrivalEventArgs e)
{
Console.WriteLine(e.RecievedData);
Console.WriteLine(e.IsComplete);
}
//========================
//Class1.cs
using System;
using System.Net;
using System.Threading;
using System.Text;
using System.IO;
public class RequestState
{
const int BUFFER_SIZE = 1024;
public System.Text.StringBuilder RequestData;
public byte[] BufferRead;
public System.Net.HttpWebRequest Request;
public System.IO.Stream ResponseStream;
public System.Text.Decoder StreamDecode = System.Text.Encoding.GetEncoding("gb2312").GetDecoder();
public RequestState()
{
BufferRead = new byte[BUFFER_SIZE];
RequestData = new System.Text.StringBuilder("");
Request = null;
ResponseStream = null;
}
}
public delegate void DataArrivalEventHandler(object sender, DataArrivalEventArgs e);
public class DataArrivalEventArgs : System.EventArgs
{
private string mRecievedData;
private bool mIsComplete = false;
public DataArrivalEventArgs(string Data,bool Complete)
{
mRecievedData = Data;
mIsComplete = Complete;
}
public string RecievedData
{
get
{
return mRecievedData;
}
}
public bool IsComplete
{
get
{
return mIsComplete;
}
}
}
class HttpRequestResponse
{
public static System.Threading.ManualResetEvent allDone = new System.Threading.ManualResetEvent(false);
const int BUFFER_SIZE = 1024;
public event DataArrivalEventHandler DataArrival;
protected virtual void OnDataArrival(DataArrivalEventArgs e)
{
if (DataArrival != null)
{
DataArrival(this, e);
}
}
private System.Text.Encoding mRequestEncoding = System.Text.Encoding.GetEncoding("gb2312");
public void SendRequest(string RequestURL,string RequestData,string RequestMethod)
{
HttpWebRequest req;
RequestState rs = new RequestState();
if (RequestData != null)
{
int i=0, j;
Char[] reserved = {''?'', ''='', ''&''};
while(i<RequestData.Length)
{
j=RequestData.IndexOfAny(reserved, i);
if (j==-1)
{
rs.RequestData.Append(System.Web.HttpUtility.UrlEncode(RequestData.Substring(i, RequestData.Length-i),mRequestEncoding));
break;
}
rs.RequestData.Append(System.Web.HttpUtility.UrlEncode(RequestData.Substring(i, j-i),mRequestEncoding));
rs.RequestData.Append(RequestData.Substring(j,1));
i = j+1;
}
}
if (RequestMethod.ToUpper() == "POST")
{
byte[] Buffer = null;
Buffer = mRequestEncoding.GetBytes(rs.RequestData.ToString());
req =(HttpWebRequest) WebRequest.Create(RequestURL);
req.ContentLength = Buffer.Length;
req.Method = RequestMethod;
req.ContentType = "application/x-www-form-urlencoded";
Stream newStream = req.GetRequestStream();
newStream.Write(Buffer, 0, Buffer.Length);
newStream.Close();
}
else
{
req =(HttpWebRequest) WebRequest.Create(RequestURL + "?" + rs.RequestData.ToString());
}
rs.Request = req;
System.IAsyncResult r = (System.IAsyncResult) req.BeginGetResponse(new System.AsyncCallback(ResponseCallback), rs);
}
private void ResponseCallback(IAsyncResult ar)
{
RequestState rs = (RequestState) ar.AsyncState;
System.Net.HttpWebRequest req = rs.Request;
System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse) req.EndGetResponse(ar);
System.IO.Stream ResponseStream = resp.GetResponseStream();
rs.ResponseStream = ResponseStream;
IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
}
private void ReadCallBack(IAsyncResult asyncResult)
{
RequestState rs = (RequestState)asyncResult.AsyncState;
System.IO.Stream responseStream = rs.ResponseStream;
int read = responseStream.EndRead( asyncResult );
if (read > 0)
{
Char[] charBuffer = new Char[BUFFER_SIZE];
int len = rs.StreamDecode.GetChars( rs.BufferRead, 0, read, charBuffer, 0 );
System.String str = new System.String( charBuffer, 0, len);
OnDataArrival(new DataArrivalEventArgs(str,false));
rs.RequestData.Append(str);
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();
}
responseStream.Close();
OnDataArrival(new DataArrivalEventArgs("\n",true));
allDone.Set();
}
return;
}
}
Tags:
作者:佚名评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论