C# 刚写的 HttpRequsetResponse 类,异步、事件... 还热乎着呢!-.Net技术-3P代码网
繁体中文
设为首页
加入收藏
当前位置:.Net技术首页 >> 远程及网络应用 >> C# 刚写的 HttpRequsetResponse 类,异步、事件... 还热乎着呢!

C# 刚写的 HttpRequsetResponse 类,异步、事件... 还热乎着呢!

2004-10-01 08:26:10  作者:  来源:互联网  浏览次数:22  文字大小:【】【】【
简介://调用示例: private void button1_Click(object sender, System.EventArgs e) {     HttpRequestResponse xx = new HttpRequestResponse();     xx.DataArrival += ne...

//调用示例:

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

{

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;

}

}

责任编辑:admin
相关文章