//调用示例: /* 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 = "[email protected]"; 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; } }

|