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

王朝c#·作者佚名  2006-01-08
宽屏版  字体: |||超大  

//调用示例:

/*

2003-7-1

1.支持Proxy

2.可指定同步或异步

3.一些小修改

*/

private void button1_Click(object sender, System.EventArgs e)

{

HttpRequestResponse xx = new HttpRequestResponse();

xx.DataArrival += new DataArrivalEventHandler(xx_DataArrival);

//xx.SendRequest(@"http://localhost:2080/examples/myservlets/servlet2","message=QQ&desttel=13910911925&mytel=13910081138&mypwd=263996211");

xx.SendRequest(@"http://localhost","message=你好QQ&desttel=13910911925&mytel=13910081138&mypwd=263996211","GET",true);

xx.SendRequest("http://localhost/quickstart/util/srcview.aspx?path=/quickstart/howto/samples/net/WebRequests/clientGETasync.src","post",false);

}

private int i=0;

private void xx_DataArrival(object sender, DataArrivalEventArgs e)

{

Console.WriteLine( i++);

Console.Write(e.RecievedData );

if (e.IsComplete)

{

Console.Write("[" + ((HttpRequestResponse) sender).Request.CookieContainer.GetCookieHeader(((HttpRequestResponse) sender).Response.ResponseUri).ToString() + "]");

}

}

//========================

//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");

private bool mUseProxy = false;

public bool UseProxy

{

get

{

return mUseProxy;

}

set

{

mUseProxy = value;

}

}

private System.Net.WebProxy mWP = System.Net.WebProxy.GetDefaultProxy();

public System.Net.WebProxy Proxy

{

get

{

return mWP;

}

set

{

mWP = value;

}

}

private System.Net.HttpWebRequest mHWReq = null;

public System.Net.HttpWebRequest Request

{

get

{

return mHWReq;

}

}

private System.Net.HttpWebResponse mHWRsp = null;

public System.Net.HttpWebResponse Response

{

get

{

return mHWRsp;

}

}

public void SendRequest(string RequestURL,string RequestData,bool Async)

{

SendRequest(RequestURL,RequestData,"GET",Async);

}

public void SendRequest(string RequestURL,string RequestData,string RequestMethod,bool Async)

{

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());

}

req.Credentials = CredentialCache.DefaultCredentials;

req.UserAgent = "playyuer@Microshaoft.com";

req.KeepAlive = true;

req.Headers.Set("Pragma", "no-cache");

req.Timeout = 300000;

if (mUseProxy)

{

if (mWP == null)

mWP = System.Net.WebProxy.GetDefaultProxy();

GlobalProxySelection.Select = mWP;

}

rs.Request = req;

mHWReq = req;

System.IAsyncResult r = (System.IAsyncResult) req.BeginGetResponse(new System.AsyncCallback(ResponseCallback), rs);

if (!Async)

allDone.WaitOne();

}

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();

allDone.Set();

OnDataArrival(new DataArrivalEventArgs("\n",true));

}

return;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有