HttpWebRequest.BeginGetResponse(AsyncCallback, Object) 方法
定義
開始對網際網路資源的非同步要求。Begins an asynchronous request to an Internet resource.
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 委派The AsyncCallback delegate
- state
- Object
這個要求的狀態物件。The state object for this request.
傳回
IAsyncResult,參考回應的非同步要求。An IAsyncResult that references the asynchronous request for a response.
例外狀況
資料流已經由先前對 BeginGetResponse(AsyncCallback, Object) 的呼叫使用。The stream is already in use by a previous call to BeginGetResponse(AsyncCallback, Object)
-或--or-
TransferEncoding 設定為值,且 SendChunked 是 false
。TransferEncoding is set to a value and SendChunked is false
.
-或--or- 執行緒集區中的執行緒即將用盡。The thread pool is running out of threads.
Method 是 GET 或 HEAD,且 ContentLength 大於零或 SendChunked 為 true
。Method is GET or HEAD, and either ContentLength is greater than zero or SendChunked is true
.
-或--or-
KeepAlive 是 true
、AllowWriteStreamBuffering 是 false
;若不是 ContentLength 為 -1,就是 SendChunked 為 false
;而且 Method 是 POST 或 PUT。KeepAlive is true
, AllowWriteStreamBuffering is false
, and either ContentLength is -1, SendChunked is false
and Method is POST or PUT.
-或--or- HttpWebRequest 具有實體主體,但 BeginGetResponse(AsyncCallback, Object) 方法在沒有呼叫 BeginGetRequestStream(AsyncCallback, Object) 方法的情況下呼叫。The HttpWebRequest has an entity body but the BeginGetResponse(AsyncCallback, Object) method is called without calling the BeginGetRequestStream(AsyncCallback, Object) method.
-或--or- ContentLength 大於零,但應用程式不會寫入所有承諾的資料The ContentLength is greater than zero, but the application does not write all of the promised data.
範例
下列程式碼範例會使用 BeginGetResponse 方法,對網際網路資源進行非同步要求。The following code example uses the BeginGetResponse method to make an asynchronous request for an Internet resource.
注意
在非同步要求的案例中,用戶端應用程式必須負責執行自己的超時機制。In the case of asynchronous requests, it is the responsibility of the client application to implement its own time-out mechanism. 下列程式碼範例示範如何執行這項操作。The following code example shows how to do it.
#using <System.dll>
using namespace System;
using namespace System::Net;
using namespace System::IO;
using namespace System::Text;
using namespace System::Threading;
public ref class RequestState
{
private:
// This class stores the State of the request.
const int BUFFER_SIZE;
public:
StringBuilder^ requestData;
array<Byte>^BufferRead;
HttpWebRequest^ request;
HttpWebResponse^ response;
Stream^ streamResponse;
RequestState()
: BUFFER_SIZE( 1024 )
{
BufferRead = gcnew array<Byte>(BUFFER_SIZE);
requestData = gcnew StringBuilder( "" );
request = nullptr;
streamResponse = nullptr;
}
};
ref class HttpWebRequest_BeginGetResponse
{
public:
static ManualResetEvent^ allDone = gcnew ManualResetEvent( false );
literal int BUFFER_SIZE = 1024;
literal int DefaultTimeOut = 120000; // 2 minute timeout
// Abort the request if the timer fires.
static void TimeoutCallback( Object^ state, bool timedOut )
{
if ( timedOut )
{
HttpWebRequest^ request = dynamic_cast<HttpWebRequest^>(state);
if ( request != nullptr )
{
request->Abort();
}
}
}
static void RespCallback( IAsyncResult^ asynchronousResult )
{
try
{
// State of request is asynchronous.
RequestState^ myRequestState = dynamic_cast<RequestState^>(asynchronousResult->AsyncState);
HttpWebRequest^ myHttpWebRequest = myRequestState->request;
myRequestState->response = dynamic_cast<HttpWebResponse^>(myHttpWebRequest->EndGetResponse( asynchronousResult ));
// Read the response into a Stream object.
Stream^ responseStream = myRequestState->response->GetResponseStream();
myRequestState->streamResponse = responseStream;
// Begin the Reading of the contents of the HTML page and print it to the console.
IAsyncResult^ asynchronousInputRead = responseStream->BeginRead( myRequestState->BufferRead, 0, BUFFER_SIZE, gcnew AsyncCallback( ReadCallBack ), myRequestState );
return;
}
catch ( WebException^ e )
{
Console::WriteLine( "\nRespCallback Exception raised!" );
Console::WriteLine( "\nMessage: {0}", e->Message );
Console::WriteLine( "\nStatus: {0}", e->Status );
}
allDone->Set();
}
static void ReadCallBack( IAsyncResult^ asyncResult )
{
try
{
RequestState^ myRequestState = dynamic_cast<RequestState^>(asyncResult->AsyncState);
Stream^ responseStream = myRequestState->streamResponse;
int read = responseStream->EndRead( asyncResult );
// Read the HTML page and then print it to the console.
if ( read > 0 )
{
myRequestState->requestData->Append( Encoding::ASCII->GetString( myRequestState->BufferRead, 0, read ) );
IAsyncResult^ asynchronousResult = responseStream->BeginRead( myRequestState->BufferRead, 0, BUFFER_SIZE, gcnew AsyncCallback( ReadCallBack ), myRequestState );
return;
}
else
{
Console::WriteLine( "\nThe contents of the Html page are : " );
if ( myRequestState->requestData->Length > 1 )
{
String^ stringContent;
stringContent = myRequestState->requestData->ToString();
Console::WriteLine( stringContent );
}
Console::WriteLine( "Press any key to continue.........." );
Console::ReadLine();
responseStream->Close();
}
}
catch ( WebException^ e )
{
Console::WriteLine( "\nReadCallBack Exception raised!" );
Console::WriteLine( "\nMessage: {0}", e->Message );
Console::WriteLine( "\nStatus: {0}", e->Status );
}
allDone->Set();
}
};
int main()
{
try
{
// Create a HttpWebrequest object to the desired URL.
HttpWebRequest^ myHttpWebRequest = dynamic_cast<HttpWebRequest^>(WebRequest::Create( "http://www.contoso.com" ));
/**
* If you are behind a firewall and you do not have your browser proxy setup
* you need to use the following proxy creation code.
// Create a proxy object.
WebProxy* myProxy = new WebProxy();
// Associate a new Uri object to the _wProxy object, using the proxy address
// selected by the user.
myProxy.Address = new Uri(S"http://myproxy");
// Finally, initialize the Web request object proxy property with the _wProxy
// object.
myHttpWebRequest.Proxy=myProxy;
***/
// Create an instance of the RequestState and assign the previous myHttpWebRequest
// object to its request field.
RequestState^ myRequestState = gcnew RequestState;
myRequestState->request = myHttpWebRequest;
// Start the asynchronous request.
IAsyncResult^ result = dynamic_cast<IAsyncResult^>(myHttpWebRequest->BeginGetResponse( gcnew AsyncCallback( HttpWebRequest_BeginGetResponse::RespCallback ), myRequestState ));
// this line impliments the timeout, if there is a timeout, the callback fires and the request becomes aborted
ThreadPool::RegisterWaitForSingleObject( result->AsyncWaitHandle, gcnew WaitOrTimerCallback( HttpWebRequest_BeginGetResponse::TimeoutCallback ), myHttpWebRequest, HttpWebRequest_BeginGetResponse::DefaultTimeOut, true );
// The response came in the allowed time. The work processing will happen in the
// callback function.
HttpWebRequest_BeginGetResponse::allDone->WaitOne();
// Release the HttpWebResponse resource.
myRequestState->response->Close();
}
catch ( WebException^ e )
{
Console::WriteLine( "\nMain Exception raised!" );
Console::WriteLine( "\nMessage: {0}", e->Message );
Console::WriteLine( "\nStatus: {0}", e->Status );
Console::WriteLine( "Press any key to continue.........." );
}
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();
}
}
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Threading;
public class RequestState
{
// This class stores the State of the request.
const int BUFFER_SIZE = 1024;
public StringBuilder requestData;
public byte[] BufferRead;
public HttpWebRequest request;
public HttpWebResponse response;
public Stream streamResponse;
public RequestState()
{
BufferRead = new byte[BUFFER_SIZE];
requestData = new StringBuilder("");
request = null;
streamResponse = null;
}
}
class HttpWebRequest_BeginGetResponse
{
public static ManualResetEvent allDone= new ManualResetEvent(false);
const int BUFFER_SIZE = 1024;
const int DefaultTimeout = 2 * 60 * 1000; // 2 minutes timeout
// Abort the request if the timer fires.
private static void TimeoutCallback(object state, bool timedOut) {
if (timedOut) {
HttpWebRequest request = state as HttpWebRequest;
if (request != null) {
request.Abort();
}
}
}
static void Main()
{
try
{
// Create a HttpWebrequest object to the desired URL.
HttpWebRequest myHttpWebRequest= (HttpWebRequest)WebRequest.Create("http://www.contoso.com");
/**
* If you are behind a firewall and you do not have your browser proxy setup
* you need to use the following proxy creation code.
// Create a proxy object.
WebProxy myProxy = new WebProxy();
// Associate a new Uri object to the _wProxy object, using the proxy address
// selected by the user.
myProxy.Address = new Uri("http://myproxy");
// Finally, initialize the Web request object proxy property with the _wProxy
// object.
myHttpWebRequest.Proxy=myProxy;
***/
// Create an instance of the RequestState and assign the previous myHttpWebRequest
// object to its request field.
RequestState myRequestState = new RequestState();
myRequestState.request = myHttpWebRequest;
// Start the asynchronous request.
IAsyncResult result=
(IAsyncResult) myHttpWebRequest.BeginGetResponse(new AsyncCallback(RespCallback),myRequestState);
// this line implements the timeout, if there is a timeout, the callback fires and the request becomes aborted
ThreadPool.RegisterWaitForSingleObject (result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), myHttpWebRequest, DefaultTimeout, true);
// The response came in the allowed time. The work processing will happen in the
// callback function.
allDone.WaitOne();
// Release the HttpWebResponse resource.
myRequestState.response.Close();
}
catch(WebException e)
{
Console.WriteLine("\nMain Exception raised!");
Console.WriteLine("\nMessage:{0}",e.Message);
Console.WriteLine("\nStatus:{0}",e.Status);
Console.WriteLine("Press any key to continue..........");
}
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 RespCallback(IAsyncResult asynchronousResult)
{
try
{
// State of request is asynchronous.
RequestState myRequestState=(RequestState) asynchronousResult.AsyncState;
HttpWebRequest myHttpWebRequest=myRequestState.request;
myRequestState.response = (HttpWebResponse) myHttpWebRequest.EndGetResponse(asynchronousResult);
// Read the response into a Stream object.
Stream responseStream = myRequestState.response.GetResponseStream();
myRequestState.streamResponse=responseStream;
// Begin the Reading of the contents of the HTML page and print it to the console.
IAsyncResult asynchronousInputRead = responseStream.BeginRead(myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
return;
}
catch(WebException e)
{
Console.WriteLine("\nRespCallback Exception raised!");
Console.WriteLine("\nMessage:{0}",e.Message);
Console.WriteLine("\nStatus:{0}",e.Status);
}
allDone.Set();
}
private static void ReadCallBack(IAsyncResult asyncResult)
{
try
{
RequestState myRequestState = (RequestState)asyncResult.AsyncState;
Stream responseStream = myRequestState.streamResponse;
int read = responseStream.EndRead( asyncResult );
// Read the HTML page and then print it to the console.
if (read > 0)
{
myRequestState.requestData.Append(Encoding.ASCII.GetString(myRequestState.BufferRead, 0, read));
IAsyncResult asynchronousResult = responseStream.BeginRead( myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
return;
}
else
{
Console.WriteLine("\nThe contents of the Html page are : ");
if(myRequestState.requestData.Length>1)
{
string stringContent;
stringContent = myRequestState.requestData.ToString();
Console.WriteLine(stringContent);
}
Console.WriteLine("Press any key to continue..........");
Console.ReadLine();
responseStream.Close();
}
}
catch(WebException e)
{
Console.WriteLine("\nReadCallBack Exception raised!");
Console.WriteLine("\nMessage:{0}",e.Message);
Console.WriteLine("\nStatus:{0}",e.Status);
}
allDone.Set();
}
Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Threading
Public Class RequestState
' This class stores the State of the request.
Private BUFFER_SIZE As Integer = 1024
Public requestData As StringBuilder
Public BufferRead() As Byte
Public request As HttpWebRequest
Public response As HttpWebResponse
Public streamResponse As Stream
Public Sub New()
BufferRead = New Byte(BUFFER_SIZE) {}
requestData = New StringBuilder("")
request = Nothing
streamResponse = Nothing
End Sub
End Class
Class HttpWebRequest_BeginGetResponse
Public Shared allDone As New ManualResetEvent(False)
Private BUFFER_SIZE As Integer = 1024
Private DefaultTimeout As Integer = 2 * 60 * 1000
' 2 minutes timeout
' Abort the request if the timer fires.
Private Shared Sub TimeoutCallback(state As Object, timedOut As Boolean)
If timedOut Then
Dim request As HttpWebRequest = state
If Not (request Is Nothing) Then
request.Abort()
End If
End If
End Sub
Shared Sub Main()
Try
' Create a HttpWebrequest object to the desired URL.
Dim myHttpWebRequest As HttpWebRequest = WebRequest.Create("http://www.contoso.com")
' Create an instance of the RequestState and assign the previous myHttpWebRequest
' object to its request field.
Dim myRequestState As New RequestState()
myRequestState.request = myHttpWebRequest
Dim myResponse As New HttpWebRequest_BeginGetResponse()
' Start the asynchronous request.
Dim result As IAsyncResult = CType(myHttpWebRequest.BeginGetResponse(New AsyncCallback(AddressOf RespCallback), myRequestState), IAsyncResult)
' this line implements the timeout, if there is a timeout, the callback fires and the request aborts.
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, New WaitOrTimerCallback(AddressOf TimeoutCallback), myHttpWebRequest, myResponse.DefaultTimeout, True)
' The response came in the allowed time. The work processing will happen in the
' callback function.
allDone.WaitOne()
' Release the HttpWebResponse resource.
myRequestState.response.Close()
Catch e As WebException
Console.WriteLine(ControlChars.Lf + "Main Exception raised!")
Console.WriteLine(ControlChars.Lf + "Message:{0}", e.Message)
Console.WriteLine(ControlChars.Lf + "Status:{0}", e.Status)
Console.WriteLine("Press any key to continue..........")
Catch e As Exception
Console.WriteLine(ControlChars.Lf + "Main Exception raised!")
Console.WriteLine("Source :{0} ", e.Source)
Console.WriteLine("Message :{0} ", e.Message)
Console.WriteLine("Press any key to continue..........")
Console.Read()
End Try
End Sub
Private Shared Sub RespCallback(asynchronousResult As IAsyncResult)
Try
' State of request is asynchronous.
Dim myRequestState As RequestState = CType(asynchronousResult.AsyncState, RequestState)
Dim myHttpWebRequest As HttpWebRequest = myRequestState.request
myRequestState.response = CType(myHttpWebRequest.EndGetResponse(asynchronousResult), HttpWebResponse)
' Read the response into a Stream object.
Dim responseStream As Stream = myRequestState.response.GetResponseStream()
myRequestState.streamResponse = responseStream
' Begin the Reading of the contents of the HTML page and print it to the console.
Dim asynchronousInputRead As IAsyncResult = responseStream.BeginRead(myRequestState.BufferRead, 0, 1024, New AsyncCallback(AddressOf ReadCallBack), myRequestState)
Return
Catch e As WebException
Console.WriteLine(ControlChars.Lf + "RespCallback Exception raised!")
Console.WriteLine(ControlChars.Lf + "Message:{0}", e.Message)
Console.WriteLine(ControlChars.Lf + "Status:{0}", e.Status)
End Try
allDone.Set()
End Sub
Private Shared Sub ReadCallBack(asyncResult As IAsyncResult)
Try
Dim myRequestState As RequestState = CType(asyncResult.AsyncState, RequestState)
Dim responseStream As Stream = myRequestState.streamResponse
Dim read As Integer = responseStream.EndRead(asyncResult)
' Read the HTML page and then print it to the console.
If read > 0 Then
myRequestState.requestData.Append(Encoding.ASCII.GetString(myRequestState.BufferRead, 0, read))
Dim asynchronousResult As IAsyncResult = responseStream.BeginRead(myRequestState.BufferRead, 0, 1024, New AsyncCallback(AddressOf ReadCallBack), myRequestState)
Return
Else
Console.WriteLine(ControlChars.Lf + "The contents of the Html page are : ")
If myRequestState.requestData.Length > 1 Then
Dim stringContent As String
stringContent = myRequestState.requestData.ToString()
Console.WriteLine(stringContent)
End If
Console.WriteLine("Press any key to continue..........")
Console.ReadLine()
responseStream.Close()
End If
Catch e As WebException
Console.WriteLine(ControlChars.Lf + "ReadCallBack Exception raised!")
Console.WriteLine(ControlChars.Lf + "Message:{0}", e.Message)
Console.WriteLine(ControlChars.Lf + "Status:{0}", e.Status)
End Try
allDone.Set()
End Sub
End Class
備註
BeginGetResponse方法會針對來自網際網路資源的回應啟動非同步要求。The BeginGetResponse method starts an asynchronous request for a response from the Internet resource. 非同步回呼方法會使用 EndGetResponse 方法來傳回實際的 WebResponse 。The asynchronous callback method uses the EndGetResponse method to return the actual WebResponse.
ProtocolViolationException當在類別上設定的屬性發生衝突時,會在數種情況下擲回 HttpWebRequest 。A ProtocolViolationException is thrown in several cases when the properties set on the HttpWebRequest class are conflicting. 如果應用程式將 ContentLength 屬性和 SendChunked 屬性設定為,然後傳送 true
HTTP GET 要求,就會發生這個例外狀況。This exception occurs if an application sets the ContentLength property and the SendChunked property to true
, and then sends an HTTP GET request. 如果應用程式嘗試將區區塊轉送至僅支援 HTTP 1.0 通訊協定的伺服器,就會發生這個例外狀況,其中不支援這種情況。This exception occurs if an application tries to send chunked to a server that only supports HTTP 1.0 protocol, where this is not supported. 如果應用程式嘗試在未設定屬性的情況下傳送資料 ContentLength ,或在 SendChunked false
停用緩衝處理,且在 keepalive 連接上 (KeepAlive 屬性為 true
,則會發生這個例外狀況) .
This exception occurs if an application tries to send data without setting the ContentLength property or the SendChunked is false
when buffering is disabled and on a keepalive connection (the KeepAlive property is true
).
如果擲回 WebException ,請使用例外狀況的 Response 和 Status 屬性來判斷伺服器的回應。If a WebException is thrown, use the Response and Status properties of the exception to determine the response from the server.
BeginGetResponse此方法需要一些同步設定工作,才能完成 (DNS 解析、proxy 偵測和 TCP 通訊端連線,例如在此方法變成非同步之前) 。The BeginGetResponse method requires some synchronous setup tasks to complete (DNS resolution, proxy detection, and TCP socket connection, for example) before this method becomes asynchronous. 因此,永遠不應在使用者介面上呼叫這個方法 (UI) 執行緒,因為這可能需要相當長的時間 (多達數分鐘,視網路設定而定,) 在擲回錯誤的例外狀況或方法成功之前,完成初始同步設定工作。As a result, this method should never be called on a user interface (UI) thread because it might take considerable time (up to several minutes depending on network settings) to complete the initial synchronous setup tasks before an exception for an error is thrown or the method succeeds.
若要深入瞭解執行緒集區,請參閱 受控執行緒集區。To learn more about the thread pool, see The managed thread pool.
注意
您的應用程式無法混合特定要求的同步和非同步方法。Your application cannot mix synchronous and asynchronous methods for a particular request. 如果您呼叫 BeginGetRequestStream 方法,就必須使用 BeginGetResponse 方法來取出回應。If you call the BeginGetRequestStream method, you must use the BeginGetResponse method to retrieve the response.
注意
在應用程式中啟用網路追蹤時,這個成員會輸出追蹤資訊。This member outputs trace information when you enable network tracing in your application. 如需詳細資訊,請參閱 .NET Framework 中的網路追蹤。For more information, see Network Tracing in the .NET Framework.