一个可同步调用异步执行的HttpWebRequest类

来源:互联网 发布:淘宝开团怎么抢 编辑:程序博客网 时间:2024/06/08 05:23

下面这个例子是对MSDN上异步HttpWebRequest例子修改,下载指定URL的页面,可同步调用,调用方法如下:

string str=MyHttp.GetPage("http://www.sohu.com")   ;

 public class MyHttp
    {
        public static ManualResetEvent allDone = new ManualResetEvent(false);
        const int BUFFER_SIZE = 1024;
        public static string GetPage(string url)
        {
            HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(url);
            wreq.UserAgent = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; Alexa Toolbar)";
            wreq.Headers.Add("accept-language", "zh-cn");
            wreq.Headers.Add("accept-encoding", "gzip,   deflate");
            RequestState rs = new RequestState();
            rs.Request = wreq;
            IAsyncResult r = (IAsyncResult)wreq.BeginGetResponse(
                new AsyncCallback(RespCallback), rs);
            allDone.WaitOne();
            allDone.Reset();
            return rs.RequestData.ToString();
        }
        private static void RespCallback(IAsyncResult ar)
        {
            RequestState rs = (RequestState)ar.AsyncState;
            WebRequest req = rs.Request;
            WebResponse resp = null;
            try
            {
                resp = req.EndGetResponse(ar);
                resp.Headers.Add("accept-language", "zh-cn");
                resp.Headers.Add("accept-encoding", "gzip,   deflate");
            }
            catch (Exception ex)
            {
                allDone.Set();
                return;
            }
            Stream ResponseStream = resp.GetResponseStream();
            rs.ResponseStream = ResponseStream;
            IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0,
                BUFFER_SIZE, new AsyncCallback(ReadCallBack), rs);
        }
        private static void ReadCallBack(IAsyncResult asyncResult)
        {
            // Get the RequestState object from AsyncResult.
            RequestState rs = (RequestState)asyncResult.AsyncState;
            // Retrieve the ResponseStream that was set in RespCallback.
            Stream responseStream = rs.ResponseStream;

            // Read rs.BufferRead to verify that it contains data.
            int read = responseStream.EndRead(asyncResult);
            if (read > 0)
            {
                // Prepare a Char array buffer for converting to Unicode.
                Char[] charBuffer = new Char[BUFFER_SIZE];

                // Convert byte stream to Char array and then to String.
                // len contains the number of characters converted to Unicode.
                int len =
                    rs.StreamDecode.GetChars(rs.BufferRead, 0, read, charBuffer, 0);

                String str = new String(charBuffer, 0, len);

                // Append the recently read data to the RequestData stringbuilder
                // object contained in RequestState.
                rs.RequestData.Append(
                    Encoding.Default.GetString(rs.BufferRead, 0, read));
                // Continue reading data until
                // responseStream.EndRead returns –1.
                IAsyncResult ar = responseStream.BeginRead(
                    rs.BufferRead, 0, BUFFER_SIZE,
                    new AsyncCallback(ReadCallBack), rs);
            }
            else
            {
                // Close down the response stream.
                responseStream.Close();
                // Set the ManualResetEvent so the main thread can exit.
                allDone.Set();
            }
            return;
        }
    }

    public class RequestState
    {
        const int BufferSize = 1024;
        public StringBuilder RequestData;
        public byte[] BufferRead;
        public WebRequest Request;
        public WebResponse resp;
        public Stream ResponseStream;

        // Create Decoder for appropriate enconding type.
        public Decoder StreamDecode = Encoding.Default.GetDecoder();
        public RequestState()
        {
            BufferRead = new byte[BufferSize];
            RequestData = new StringBuilder(String.Empty);
            Request = null;
            resp = null;
            ResponseStream = null;
        }
    } 

原创粉丝点击