C# 刚写的 HttpRequsetResponse 类,异步、事件... 还热乎着呢!(2003-7-1更新)

发表于:2007-06-30来源:作者:点击数: 标签:
1.支持Proxy 2.可指定同步或异步 3.一些小修改 //调用示例: private void button1_Click(object sender, System.EventArgs e) { HttpRequestResponse xx = new HttpRequestResponse(); xx.DataArrival += new DataArrivalEventHandler(xx_DataArrival); //xx.
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;
    }
}

原文转自:http://www.ltesting.net