private void RequestCompleted(IAsyncResult asyncResult) { AsynHttpContext _context = asyncResult.AsyncState as AsynHttpContext; try { if (asyncResult == null) { return; } _context.AsynResponse = (HttpWebResponse)_context.AsynRequest.EndGetResponse(asyncResult); } catch (WebException e) { // _logger.Error(e, "RequestCompleted WebException."); _context.AsynResponse = (HttpWebResponse)e.Response; if (_context.AsynResponse == null) { EndInvoke(_context, e); return; } } catch (Exception e) { //_logger.Error(e, "RequestCompleted exception."); EndInvoke(_context, e); return; } try { AsynStream stream = new AsynStream(_context.AsynResponse.GetResponseStream()); stream.Offset = 0; long length = _context.AsynResponse.ContentLength; if (length < 0) { length = DEFAULT_LENGTH; notContentLength = true; } buffer = new byte[length]; stream.UnreadLength = buffer.Length; IAsyncResult asyncRead = stream.NetStream.BeginRead(buffer, 0, stream.UnreadLength, new AsyncCallback(ReadCallBack), stream); } catch (Exception e) { // _logger.Error(e, "BeginRead exception."); EndInvoke(_context, e); } }
private void ReadCallBack(IAsyncResult asyncResult) { try { AsynStream stream = asyncResult.AsyncState as AsynStream; int read = 0; if (stream.UnreadLength > 0) { read = stream.NetStream.EndRead(asyncResult); } if (read > 0) { stream.Offset += read; stream.UnreadLength -= read; stream.Count++; if (notContentLength && stream.Offset >= buffer.Length) { Array.Resize <byte>(ref buffer, stream.Offset + DEFAULT_POS_LENGTH); stream.UnreadLength = DEFAULT_POS_LENGTH; } IAsyncResult asyncRead = stream.NetStream.BeginRead(buffer, stream.Offset, stream.UnreadLength, new AsyncCallback(ReadCallBack), stream); } else { _watch.Stop(); stream.NetStream.Dispose(); if (buffer.Length != stream.Offset) { Array.Resize <byte>(ref buffer, stream.Offset); } _context.ExecTime = _watch.ElapsedMilliseconds; _context.SetResponseBytes(buffer); _action.Invoke(_context, null); } } catch (Exception e) { // _logger.Error(e, "ReadCallBack exception."); EndInvoke(_context, e); } }