HttpWebRequest.BeginGetResponse(AsyncCallback, Object) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
開始對因特網資源的異步要求。
public:
override IAsyncResult ^ BeginGetResponse(AsyncCallback ^ callback, System::Object ^ state);
public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state);
public override IAsyncResult BeginGetResponse(AsyncCallback? callback, object? state);
override this.BeginGetResponse : AsyncCallback * obj -> IAsyncResult
Public Overrides Function BeginGetResponse (callback As AsyncCallback, state As Object) As IAsyncResult
參數
- callback
- AsyncCallback
AsyncCallback 委派。
- state
- Object
這個要求的狀態物件。
傳回
參考回應異步要求的 IAsyncResult。
例外狀況
先前對 BeginGetResponse(AsyncCallback, Object) 的呼叫已使用數據流
-或-
TransferEncoding 設定為 值,且 SendChunkedfalse
。
-或-
線程集區已用盡線程。
Method 為 GET 或 HEAD,且 ContentLength 大於零或 SendChunked 為 true
。
-或-
KeepAlive 是 true
,AllowWriteStreamBuffering 是 false
,ContentLength 為 -1,SendChunked 是 false
,Method 為 POST 或 PUT。
-或-
HttpWebRequest 具有實體主體,但呼叫 BeginGetResponse(AsyncCallback, Object) 方法而不呼叫 BeginGetRequestStream(AsyncCallback, Object) 方法。
-或-
ContentLength 大於零,但應用程式不會寫入所有承諾的數據。
先前呼叫 Abort()。
範例
下列程式代碼範例會使用 BeginGetResponse 方法來對因特網資源提出異步要求。
注意
在異步要求的情況下,用戶端應用程式必須負責實作自己的逾時機制。 下列程式代碼範例示範如何執行。
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Threading;
public static class WebRequestAPMSample
{
private const int BufferSize = 1024;
private class RequestState
{
public StringBuilder ResponseBuilder { get; }
public byte[] ReadBuffer { get; }
public WebRequest Request { get; }
public WebResponse Response { get; set; }
public Stream ResponseStream { get; set; }
public RequestState(WebRequest request)
{
ReadBuffer = new byte[BufferSize];
ResponseBuilder = new StringBuilder();
Request = request;
}
public void OnResponseBytesRead(int read) => ResponseBuilder.Append(Encoding.UTF8.GetString(ReadBuffer, 0, read));
}
public static ManualResetEvent allDone = new ManualResetEvent(false);
public static void Main()
{
try
{
// Create a WebRequest object to the desired URL.
WebRequest webRequest = WebRequest.Create("http://www.contoso.com");
webRequest.Timeout = 10_000; // Set 10sec timeout.
// Create an instance of the RequestState and assign the previous myHttpWebRequest
// object to its request field.
RequestState requestState = new RequestState(webRequest);
// Start the asynchronous request.
IAsyncResult result = webRequest.BeginGetResponse(new AsyncCallback(ResponseCallback), requestState);
// Wait for the response or for failure. The processing happens in the callback.
allDone.WaitOne();
// Release the WebResponse resources.
requestState.Response?.Close();
}
catch (WebException e)
{
Console.WriteLine("\nMain(): WebException raised!");
Console.WriteLine("\nMessage:{0}", e.Message);
Console.WriteLine("\nStatus:{0}", e.Status);
Console.WriteLine("Press any key to continue..........");
Console.Read();
}
catch (Exception e)
{
Console.WriteLine("\nMain(): Exception raised!");
Console.WriteLine("Source :{0} ", e.Source);
Console.WriteLine("Message :{0} ", e.Message);
Console.WriteLine("Press any key to continue..........");
Console.Read();
}
}
private static void HandleSyncResponseReadCompletion(IAsyncResult asyncResult)
{
RequestState requestState = (RequestState)asyncResult.AsyncState;
Stream responseStream = requestState.ResponseStream;
bool readComplete = false;
while (asyncResult.CompletedSynchronously && !readComplete)
{
int read = responseStream.EndRead(asyncResult);
if (read > 0)
{
requestState.OnResponseBytesRead(read);
asyncResult = responseStream.BeginRead(requestState.ReadBuffer, 0, BufferSize, new AsyncCallback(ReadCallBack), requestState);
}
else
{
readComplete = true;
HandleReadCompletion(requestState);
}
}
}
private static void ResponseCallback(IAsyncResult asynchronousResult)
{
try
{
// AsyncState is an instance of RequestState.
RequestState requestState = (RequestState)asynchronousResult.AsyncState;
WebRequest request = requestState.Request;
requestState.Response = request.EndGetResponse(asynchronousResult);
// Read the response into a Stream.
Stream responseStream = requestState.Response.GetResponseStream();
requestState.ResponseStream = responseStream;
// Begin the Reading of the contents of the HTML page and print it to the console.
IAsyncResult asynchronousReadResult = responseStream.BeginRead(requestState.ReadBuffer, 0, BufferSize, new AsyncCallback(ReadCallBack), requestState);
HandleSyncResponseReadCompletion(asynchronousReadResult);
}
catch (WebException e)
{
Console.WriteLine("\nRespCallback(): Exception raised!");
Console.WriteLine("\nMessage:{0}", e.Message);
Console.WriteLine("\nStatus:{0}", e.Status);
allDone.Set();
}
}
// Print the webpage to the standard output, close the stream and signal completion.
private static void HandleReadCompletion(RequestState requestState)
{
Console.WriteLine("\nThe contents of the Html page are : ");
if (requestState.ResponseBuilder.Length > 1)
{
string stringContent;
stringContent = requestState.ResponseBuilder.ToString();
Console.WriteLine(stringContent);
}
Console.WriteLine("Press any key to continue..........");
Console.ReadLine();
requestState.ResponseStream.Close();
allDone.Set();
}
private static void ReadCallBack(IAsyncResult asyncResult)
{
if (asyncResult.CompletedSynchronously)
{
// To avoid recursive synchronous calls into ReadCallBack,
// synchronous completion is handled at the BeginRead call-site.
return;
}
try
{
RequestState requestState = (RequestState)asyncResult.AsyncState;
Stream responseStream = requestState.ResponseStream;
int read = responseStream.EndRead(asyncResult);
// Read the HTML page and then print it to the console.
if (read > 0)
{
requestState.OnResponseBytesRead(read);
IAsyncResult asynchronousResult = responseStream.BeginRead(requestState.ReadBuffer, 0, BufferSize, new AsyncCallback(ReadCallBack), requestState);
HandleSyncResponseReadCompletion(asynchronousResult);
}
else
{
HandleReadCompletion(requestState);
}
}
catch (WebException e)
{
Console.WriteLine("\nReadCallBack(): Exception raised!");
Console.WriteLine("\nMessage:{0}", e.Message);
Console.WriteLine("\nStatus:{0}", e.Status);
allDone.Set();
}
}
}
備註
謹慎
WebRequest
、HttpWebRequest
、ServicePoint
和 WebClient
已經過時,您不應該將它們用於新的開發。 請改用 HttpClient。
BeginGetResponse 方法會啟動來自因特網資源的回應異步要求。 異步回呼方法會使用 EndGetResponse 方法來傳回實際的 WebResponse。
當 HttpWebRequest 類別上設定的屬性發生衝突時,會在數種情況下擲回 ProtocolViolationException。 如果應用程式將 ContentLength 屬性和 SendChunked 屬性設定為 true
,然後傳送 HTTP GET 要求,就會發生這個例外狀況。 如果應用程式嘗試將區塊傳送至只支援 HTTP 1.0 通訊協定的伺服器,但不支援此通訊協定,就會發生此例外狀況。 如果應用程式嘗試在不設定 ContentLength 屬性的情況下傳送數據,或在停用緩衝處理時 false
SendChunked,且在保留連線上發生此例外狀況(KeepAlive 屬性為 true
).
如果擲回 WebException,請使用例外狀況的 Response 和 Status 屬性來判斷伺服器的回應。
BeginGetResponse 方法需要一些同步設定工作才能完成(例如 DNS 解析、Proxy 偵測和 TCP 套接字連線),然後這個方法才會變成異步。 因此,這個方法不應該在使用者介面 (UI) 線程上呼叫,因為可能需要相當長的時間(視網路設定而定,最多幾分鐘的時間),才能完成初始同步設定工作,然後再擲回錯誤的例外狀況或方法成功。
若要深入瞭解線程集區,請參閱 受控線程集區。
注意
您的應用程式無法混合特定要求的同步和異步方法。 如果您呼叫 BeginGetRequestStream 方法,則必須使用 BeginGetResponse 方法來擷取回應。
注意
當您在應用程式中啟用網路追蹤時,此成員會輸出追蹤資訊。 如需詳細資訊,請參閱 .NET Framework中的