private static void RespCallback(IAsyncResult ar) { // Get the RequestState object from the async result. RequestState rs = (RequestState)ar.AsyncState; try { // Get the WebRequest from RequestState. WebRequest req = rs.Request; // Call EndGetResponse, which produces the WebResponse object // that came from the request issued above. WebResponse resp = req.EndGetResponse(ar); // Start reading data from the response stream. Stream ResponseStream = resp.GetResponseStream(); // Store the response stream in RequestState to read // the stream asynchronously. rs.ResponseStream = ResponseStream; // Pass rs.BufferRead to BeginRead. Read data into rs.BufferRead IAsyncResult iarRead = ResponseStream.BeginRead(rs.BufferRead, 0, BufferSize, new System.AsyncCallback(ReadCallBack), rs); } catch (WebException ex) { // Fire the callback so we can inform the user what went wrong rs.Callback(false, ex.Message); } }
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[BufferSize]; // 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.ASCII.GetString(rs.BufferRead, 0, read)); // Continue reading data until // responseStream.EndRead returns –1. IAsyncResult ar = responseStream.BeginRead( rs.BufferRead, 0, BufferSize, new System.AsyncCallback(ReadCallBack), rs); } else { if (rs.RequestData.Length > 0) { // Display data to the console. string strContent; strContent = rs.RequestData.ToString(); rs.Callback(true, strContent); } // Close down the response stream. responseStream.Close(); } return; }