HttpWebRequest.BeginGetResponse(AsyncCallback, Object) Método

Definição

Inicia um pedido assíncrono para um recurso da Internet.

public:
 override IAsyncResult ^ BeginGetResponse(AsyncCallback ^ callback, System::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

Parâmetros

callback
AsyncCallback

O AsyncCallback delegado.

state
Object

O Estado contesta este pedido.

Devoluções

E IAsyncResult que faz referência ao pedido assíncrono para uma resposta.

Exceções

O fluxo já está em uso por uma chamada anterior para BeginGetResponse(AsyncCallback, Object)

-ou-

TransferEncoding é atribuído a um valor e SendChunked é false.

-ou-

O pool de threads está a ficar sem threads.

Method é GET ou HEAD, e ou ContentLength é maior que zero ou SendChunked é true.

-ou-

KeepAlive é true, AllowWriteStreamBuffering é false, e ou ContentLength é -1, SendChunked é false e Method é POST ou PUT.

-ou-

O HttpWebRequest tem um corpo de entidade, mas o BeginGetResponse(AsyncCallback, Object) método é chamado sem chamar o BeginGetRequestStream(AsyncCallback, Object) método.

-ou-

O ContentLength é maior que zero, mas a aplicação não escreve todos os dados prometidos.

Abort() foi anteriormente chamado.

Exemplos

O exemplo de código seguinte utiliza o BeginGetResponse método para fazer um pedido assíncrono para um recurso da Internet.

Note

No caso de pedidos assíncronos, é responsabilidade da aplicação cliente implementar o seu próprio mecanismo de time-out. O seguinte exemplo de código mostra como o fazer.

using System;
using System.Net;
using System.IO;
using System.Text;
using System.Threading;

public static class WebRequestAPMSample
{
    private const int BufferSize = 1024;

    private class RequestState
    {
        public StringBuilder ResponseBuilder { get; }
        public byte[] ReadBuffer { get; }
        public WebRequest Request { get; }
        public WebResponse Response { get; set; }
        public Stream ResponseStream { get; set; }
        public RequestState(WebRequest request)
        {
            ReadBuffer = new byte[BufferSize];
            ResponseBuilder = new StringBuilder();
            Request = request;
        }
        public void OnResponseBytesRead(int read) => ResponseBuilder.Append(Encoding.UTF8.GetString(ReadBuffer, 0, read));
    }

    public static ManualResetEvent allDone = new ManualResetEvent(false);
    

    public static void Main()
    {
        try
        {
            // Create a WebRequest object to the desired URL.
            WebRequest webRequest = WebRequest.Create("http://www.contoso.com");
            webRequest.Timeout = 10_000; // Set 10sec timeout.

            // Create an instance of the RequestState and assign the previous myHttpWebRequest
            // object to its request field.
            RequestState requestState = new RequestState(webRequest);

            // Start the asynchronous request.
            IAsyncResult result = webRequest.BeginGetResponse(new AsyncCallback(ResponseCallback), requestState);

            // Wait for the response or for failure. The processing happens in the callback.
            allDone.WaitOne();

            // Release the WebResponse resources.
            requestState.Response?.Close();
        }
        catch (WebException e)
        {
            Console.WriteLine("\nMain(): WebException raised!");
            Console.WriteLine("\nMessage:{0}", e.Message);
            Console.WriteLine("\nStatus:{0}", e.Status);
            Console.WriteLine("Press any key to continue..........");
            Console.Read();
        }
        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 HandleSyncResponseReadCompletion(IAsyncResult asyncResult)
    {
        RequestState requestState = (RequestState)asyncResult.AsyncState;
        Stream responseStream = requestState.ResponseStream;

        bool readComplete = false;
        while (asyncResult.CompletedSynchronously && !readComplete)
        {
            int read = responseStream.EndRead(asyncResult);
            if (read > 0)
            {
                requestState.OnResponseBytesRead(read);
                asyncResult = responseStream.BeginRead(requestState.ReadBuffer, 0, BufferSize, new AsyncCallback(ReadCallBack), requestState);
            }
            else
            {
                readComplete = true;
                HandleReadCompletion(requestState);
            }
        }
    }

    private static void ResponseCallback(IAsyncResult asynchronousResult)
    {
        try
        {
            // AsyncState is an instance of RequestState.
            RequestState requestState = (RequestState)asynchronousResult.AsyncState;
            WebRequest request = requestState.Request;
            requestState.Response = request.EndGetResponse(asynchronousResult);

            // Read the response into a Stream.
            Stream responseStream = requestState.Response.GetResponseStream();
            requestState.ResponseStream = responseStream;

            // Begin the Reading of the contents of the HTML page and print it to the console.
            IAsyncResult asynchronousReadResult = responseStream.BeginRead(requestState.ReadBuffer, 0, BufferSize, new AsyncCallback(ReadCallBack), requestState);
            HandleSyncResponseReadCompletion(asynchronousReadResult);
        }
        catch (WebException e)
        {
            Console.WriteLine("\nRespCallback(): Exception raised!");
            Console.WriteLine("\nMessage:{0}", e.Message);
            Console.WriteLine("\nStatus:{0}", e.Status);
            allDone.Set();
        }   
    }

    // Print the webpage to the standard output, close the stream and signal completion.
    private static void HandleReadCompletion(RequestState requestState)
    {
        Console.WriteLine("\nThe contents of the Html page are : ");
        if (requestState.ResponseBuilder.Length > 1)
        {
            string stringContent;
            stringContent = requestState.ResponseBuilder.ToString();
            Console.WriteLine(stringContent);
        }
        Console.WriteLine("Press any key to continue..........");
        Console.ReadLine();

        requestState.ResponseStream.Close();
        allDone.Set();
    }

    private static void ReadCallBack(IAsyncResult asyncResult)
    {
        if (asyncResult.CompletedSynchronously)
        {
            // To avoid recursive synchronous calls into ReadCallBack,
            // synchronous completion is handled at the BeginRead call-site.
            return;
        }

        try
        {
            RequestState requestState = (RequestState)asyncResult.AsyncState;
            Stream responseStream = requestState.ResponseStream;
            int read = responseStream.EndRead(asyncResult);
            // Read the HTML page and then print it to the console.
            if (read > 0)
            {
                requestState.OnResponseBytesRead(read);
                IAsyncResult asynchronousResult = responseStream.BeginRead(requestState.ReadBuffer, 0, BufferSize, new AsyncCallback(ReadCallBack), requestState);
                HandleSyncResponseReadCompletion(asynchronousResult);
            }
            else
            {
                HandleReadCompletion(requestState);
            }
        }
        catch (WebException e)
        {
            Console.WriteLine("\nReadCallBack(): Exception raised!");
            Console.WriteLine("\nMessage:{0}", e.Message);
            Console.WriteLine("\nStatus:{0}", e.Status);
            allDone.Set();
        }
    }
}

Observações

Atenção

WebRequest, HttpWebRequest, ServicePoint, e WebClient são obsoletos, e não deves usá-los para novos desenvolvimentos. Utilize HttpClient em substituição.

O BeginGetResponse método inicia um pedido assíncrono de resposta a partir do recurso da Internet. O método de callback assíncrono usa o EndGetResponse método para devolver o valor real WebResponse.

A ProtocolViolationException é lançado em vários casos em que as propriedades definidas na HttpWebRequest classe são conflitantes. Esta exceção ocorre se uma aplicação definir a ContentLength propriedade e a SendChunked propriedade como true, e depois enviar um pedido HTTP GET. Esta exceção ocorre se uma aplicação tentar enviar chunked para um servidor que apenas suporta o protocolo HTTP 1.0, onde este não é suportado. Esta exceção ocorre se uma aplicação tentar enviar dados sem definir a ContentLength propriedade ou o SendChunked is false quando o buffering está desativado e numa ligação keepalive (a KeepAlive propriedade é true).

Se a WebException for lançado, use as Response propriedades e Status da exceção para determinar a resposta do servidor.

O BeginGetResponse método requer algumas tarefas de configuração síncronas para serem concluídas (resolução DNS, deteção de proxy e ligação ao socket TCP, por exemplo) antes de este método se tornar assíncrono. Como resultado, este método nunca deve ser chamado numa thread de interface de utilizador (UI) porque pode demorar um tempo considerável (até vários minutos, dependendo das definições de rede) a completar as tarefas iniciais de configuração síncrona antes de ser lançada uma exceção por erro ou o método ter sucesso.

Para saber mais sobre o pool de threads, consulte O pool de threads geridos.

Note

A sua aplicação não pode misturar métodos síncronos e assíncronos para um pedido específico. Se chamar o BeginGetRequestStream método, deve usá-lo BeginGetResponse para recuperar a resposta.

Note

Esse membro gera informações de rastreamento quando você habilita o rastreamento de rede em seu aplicativo. Para mais informações, consulte Rastreamento de Rede no .NET Framework.

Aplica-se a

Ver também