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

    技术2022-05-11  113

    //调用示例:/*2003-7-11.支持Proxy2.可指定同步或异步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 ???{ ????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;?}}


    最新回复(0)