本文档已存档,并且将不进行维护。

HttpWebRequest.BeginGetResponse 方法

更新:2007 年 11 月

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

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

[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]
public override IAsyncResult BeginGetResponse(
	AsyncCallback callback,
	Object state
)
/** @attribute HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true) */
public IAsyncResult BeginGetResponse(
	AsyncCallback callback,
	Object state
)
public override function BeginGetResponse(
	callback : AsyncCallback, 
	state : Object
) : IAsyncResult

参数

callback
类型:System.AsyncCallback

AsyncCallback 委托

state
类型:System.Object

此请求的状态对象。

返回值

类型:System.IAsyncResult

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

异常条件
InvalidOperationException

流正由上一个 BeginGetResponse 调用使用

- 或 -

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

- 或 -

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

ProtocolViolationException

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

- 或 -

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

WebException

Abort 以前被调用过。

说明:

应用到此类型或成员的 HostProtectionAttribute 属性 (Attribute) 具有以下 Resources 属性 (Property) 值:ExternalThreadingHostProtectionAttribute 不影响桌面应用程序(这些应用程序通常通过双击图标、键入命令或在浏览器中输入 URL 来启动)。有关更多信息,请参见 HostProtectionAttribute 类或 SQL Server 编程和宿主保护属性

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

在一些情况下,当对 HttpWebRequest 类设置的属性发生冲突时将引发 ProtocolViolationException。如果应用程序将 ContentLength 属性和 SendChunked 属性设置为 true,然后发送 HTTP GET 请求,则会引发该异常。如果应用程序试图向仅支持 HTTP 1.0 协议而不支持分块请求的服务器发送分块请求,则会引发该异常。如果应用程序未设置 ContentLength 属性就试图发送数据,或者在 keepalive 连接(KeepAlive 属性为 true)上禁用缓冲时 SendChunkedfalse,则会引发该异常

如果引发 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 Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC

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

.NET Framework

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

.NET Compact Framework

受以下版本支持:3.5、2.0、1.0
显示: