HttpWebRequest.BeginGetResponse(AsyncCallback, Object) 方法

定义

开始对 Internet 资源的异步请求。

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 大于零或 SendChunkedtrue

-或-

KeepAlivetrueAllowWriteStreamBufferingfalseContentLength 为 -1,SendChunkedfalseMethod 为 POST 或 PUT。

-或-

HttpWebRequest 具有实体正文,但调用 BeginGetResponse(AsyncCallback, Object) 方法而不调用 BeginGetRequestStream(AsyncCallback, Object) 方法。

-或-

ContentLength 大于零,但应用程序不会写入所有承诺的数据。

以前调用 Abort()

示例

下面的代码示例使用 BeginGetResponse 方法为 Internet 资源发出异步请求。

注意

对于异步请求,客户端应用程序负责实现其自己的超时机制。 下面的代码示例演示如何执行此操作。

#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

注解

谨慎

WebRequestHttpWebRequestServicePointWebClient 已过时,不应将其用于新开发。 请改用 HttpClient

BeginGetResponse 方法启动来自 Internet 资源的响应的异步请求。 异步回调方法使用 EndGetResponse 方法返回实际 WebResponse

HttpWebRequest 类上设置的属性冲突时,会引发 ProtocolViolationException。 如果应用程序将 ContentLength 属性和 SendChunked 属性设置为 true,然后发送 HTTP GET 请求,则会发生此异常。 如果应用程序尝试将分块发送到仅支持 HTTP 1.0 协议的服务器(其中不支持此协议),则会发生此异常。 如果应用程序尝试在不设置 ContentLength 属性的情况下发送数据,或者在禁用缓冲和保持连接(KeepAlive 属性为 true)时 falseSendChunked,则会发生此异常.

如果引发 WebException,请使用异常的 ResponseStatus 属性来确定来自服务器的响应。

BeginGetResponse 方法要求完成一些同步安装任务(例如 DNS 解析、代理检测和 TCP 套接字连接),然后此方法才变为异步。 因此,不应在用户界面(UI)线程上调用此方法,因为它可能需要相当长的时间(最多几分钟,具体取决于网络设置)才能完成初始同步设置任务,然后引发错误异常或方法成功。

若要详细了解线程池,请参阅 托管线程池

注意

应用程序无法混合特定请求的同步和异步方法。 如果调用 BeginGetRequestStream 方法,则必须使用 BeginGetResponse 方法来检索响应。

注意

在应用程序中启用网络跟踪时,此成员将输出跟踪信息。 有关详细信息,请参阅 .NET Framework中的 网络跟踪。

适用于

另请参阅