导出 (0) 打印
全部展开

HttpWebRequest.BeginGetResponse 方法

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

命名空间:System.Net
程序集:System(在 system.dll 中)

声明
Public Overrides Function BeginGetResponse ( _
	callback As AsyncCallback, _
	state As Object _
) As IAsyncResult
用法
Dim instance As HttpWebRequest
Dim callback As AsyncCallback
Dim state As Object
Dim returnValue As IAsyncResult

returnValue = instance.BeginGetResponse(callback, state)
public IAsyncResult BeginGetResponse (
	AsyncCallback callback, 
	Object state
)
public override function BeginGetResponse (
	callback : AsyncCallback, 
	state : Object
) : IAsyncResult

参数

callback

AsyncCallback 委托

state

此请求的状态对象。

返回值

引用对响应的异步请求的 IAsyncResult

异常类型条件

InvalidOperationException

流正由上一个 BeginGetResponse 调用使用

- 或 -

TransferEncoding 被设置为一个值,并且 SendChunkedfalse

- 或 -

线程池中的线程即将用完。

ProtocolViolationException

Method 为 GET 或 HEAD,且 ContentLength 大于零或 SendChunkedtrue

- 或 -

KeepAlivetrueAllowWriteStreamBufferingfalse,同时 ContentLength 为 -1,SendChunkedfalse,或者 Method 为 POST 或 PUT。

WebException

Abort 以前被调用过。

BeginGetResponse 方法开始对 Internet 资源响应的异步请求。异步回调方法使用 EndGetResponse 方法返回实际的 WebResponse

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

要了解有关线程池的更多信息,请参见 托管线程池

Note注意

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

Note注意

当在应用程序中启用网络跟踪功能后,此成员将输出跟踪信息。有关更多信息,请参见 网络跟踪

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

Note注意

在异步请求中,客户端应用程序负责实现自己的超时机制。下面的代码示例演示具体做法。


Imports System
Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Threading
Imports Microsoft.VisualBasic

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 'New
End Class 'RequestState


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 'TimeoutCallback
   
   
   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 'Main
   
   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 'RespCallback
   
   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 'ReadCallBack 
End Class 'HttpWebRequest_BeginGetResponse


import System.*;
import System.Net.*;
import System.IO.*;
import System.Text.*;
import System.Threading.*;

public class RequestState
{
    // This class stores the State of the request.
    private final int BUFFER_SIZE = 1024;
    public StringBuilder requestData;
    public ubyte bufferRead[];
    public HttpWebRequest request;
    public HttpWebResponse response;
    public Stream streamResponse;
   
    public RequestState() 
    {
        bufferRead = new ubyte[BUFFER_SIZE];
        requestData = new StringBuilder("");
        request = null;
        streamResponse = null;
    } //RequestState
} //RequestState

class HttpWebRequest_BeginGetResponse
{
    public static ManualResetEvent allDone = new ManualResetEvent(false);
    private static final int BUFFER_SIZE = 1024;
    private static int defaultTimeout = 2 * 60 * 1000; // 2 minutes timeout
    
    // Abort the request if the timer fires.
    private static void TimeoutCallback(Object state, boolean timedOut)
    {
        if (timedOut ) {
            HttpWebRequest request = (HttpWebRequest)state;
            if (request  != null) {
                request.Abort();
            }
        }
    } //TimeoutCallback
   
       public static void main(String[] args)
    {
        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.set_Address(new Uri("http://myproxy"));

                // Finally, initialize the Web request object proxy property
                // with the _wProxy object.
                myHttpWebRequest.set_Proxy(myProxy);
             */

            // Create an instance of the RequestState and assign the previous 
            // myHttpWebRequest object to it's request field.  
            RequestState myRequestState = new RequestState();
            myRequestState.request = myHttpWebRequest;

            // Start the asynchronous request.
            IAsyncResult result = 
                ((IAsyncResult)(myHttpWebRequest.BeginGetResponse(
                new AsyncCallback(RespCallback), myRequestState)));

            // this line impliments the timeout, if there is a timeout, 
            // the callback fires and the request becomes aborted
            ThreadPool.RegisterWaitForSingleObject(
                result.get_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.get_Message());
            Console.WriteLine("\nStatus:{0}", e.get_Status());
            Console.WriteLine("Press any key to continue..........");
        }
        catch(System.Exception  e) {
            Console.WriteLine("\nMain Exception raised!");
            Console.WriteLine("Source :{0} ", e.get_Source());
            Console.WriteLine("Message :{0} ", e.get_Message());
            Console.WriteLine("Press any key to continue..........");
            Console.Read();
        }
    } //main
   
    private static void RespCallback(IAsyncResult asynchronousResult)
    {
        try {
            // State of request is asynchronous.
            RequestState myRequestState = 
                ((RequestState)(asynchronousResult.get_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.get_Message());
            Console.WriteLine("\nStatus:{0}", e.get_Status());
        }
        allDone.Set();
    } //RespCallback
   
    private static void ReadCallBack(IAsyncResult asyncResult) 
    {
        try {
            RequestState myRequestState = 
                ((RequestState)(asyncResult.get_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.get_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.get_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.get_Message());
            Console.WriteLine("\nStatus:{0}", e.get_Status());
        }
        allDone.Set();
    } //ReadCallBack 

Windows 98、Windows 2000 SP4、Windows CE、Windows Millennium Edition、Windows Mobile for Pocket PC、Windows Mobile for Smartphone、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition

.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求

.NET Framework

受以下版本支持:2.0、1.1、1.0

.NET Compact Framework

受以下版本支持:2.0、1.0

社区附加资源

添加
Microsoft 正在进行一项网上调查,以了解您对 MSDN 网站的意见。 如果您选择参加,我们将会在您离开 MSDN 网站时向您显示该网上调查。

是否要参加?
显示:
© 2014 Microsoft