导出 (0) 打印
全部展开

HttpWebRequest.BeginGetResponse 方法

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

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

public override IAsyncResult BeginGetResponse (
	AsyncCallback callback,
	Object 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 属性确定服务器的响应。

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

说明注意:

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

说明注意:

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

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

说明注意:

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

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();

  }

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 Server 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

Windows Vista、Microsoft Windows XP SP2 和 Windows Server 2003 SP1 支持 Microsoft .NET Framework 3.0。

.NET Framework

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

.NET Compact Framework

受以下版本支持:2.0、1.0

社区附加资源

添加
显示:
© 2014 Microsoft