trieved = state.SetResponse(response);
while (!state.RetrieveBytes(ref bytesRetrieved))
{
}
state.Close();
return state.InnerBuffer;
}
在这里BeginGetResponse(),DownloadBitsResponseCallback回调方法如下:
private static void DownloadBitsResponseCallback(IAsyncResult result)
{
DownloadBitsState asyncState = (DownloadBitsState)result.AsyncState;
WebRequest request = asyncState.Request;
Exception exception = null;
try
{
WebResponse webResponse = asyncState.WebClient.GetWebResponse(request, result);
asyncState.WebClient.m_WebResponse = webResponse;
asyncState.SetResponse(webResponse);
}
catch (Exception exception2)
{
if (((exception2 is ThreadAbortException) || (exception2 is StackOverflowException)) || (exception2 is OutOfMemoryException))
{
throw;
}
exception = exception2;
if (!(exception2 is WebException) && !(exception2 is SecurityException))
{
exception = new WebException(SR.GetString("net_webclient"), exception2);
}
AbortRequest(request);
if ((asyncState != null) && (asyncState.WriteStream != null))
{
asyncState.WriteStream.Close();
}
}
finally
{
if (exception != null)
{
asyncState.CompletionDelegate(null, exception, asyncState.AsyncOp);
}
}
}
很显然,在WebClient.GetWebResponse中我们会进行EndGetResponse()操作:
protected virtual WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
{
WebResponse response = request.EndGetResponse(result);
this.m_WebResponse = response;
return response;
}
那么继续看看SetResponse:
internal int SetResponse(WebResponse response)
{
this.ContentLength = response.ContentLength;
if ((this.ContentLength == -1L) || (this.ContentLength > 0x10000L))
{
this.Length = 0x10000L;
}
else
{
this.Length = this.ContentLength;
}
if (this.WriteStream == null)
{
if (this.ContentLength > 0x7fffffffL)
{
throw new WebException(SR.GetString ("net_webstatus_MessageLengthLimitExceeded"), WebExceptionStatus.MessageLengthLimitExceeded);
}
this.SgBuffers = new ScatterGatherBuffers(this.Length);
}
this.InnerBuffer = new byte[(int)this.Length];
this.ReadStream = response.GetResponseStream();
if (this.Async && (response.ContentLength >= 0L))
{
this.Progress.TotalBytesToReceive = response.ContentLength;
}
if (this.Async)
|