Condividi tramite


HttpWebRequest.BeginGetResponse(AsyncCallback, Object) Metodo

Definizione

Avvia una richiesta asincrona a una risorsa 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

Parametri

callback
AsyncCallback

Delegato AsyncCallback .

state
Object

Oggetto stato per questa richiesta.

Restituisce

Oggetto IAsyncResult che fa riferimento alla richiesta asincrona per una risposta.

Eccezioni

Il flusso è già in uso da una chiamata precedente a BeginGetResponse(AsyncCallback, Object)

-o-

TransferEncoding è impostato su un valore e SendChunked è false.

-o-

Il pool di thread sta esaurendo i thread.

Method è GET o HEAD e ContentLength è maggiore di zero o SendChunked è true.

-o-

KeepAlive è true, AllowWriteStreamBuffering è falsee ContentLength è -1, SendChunked è false ed Method è POST o PUT.

-o-

ha HttpWebRequest un corpo dell'entità, ma il BeginGetResponse(AsyncCallback, Object) metodo viene chiamato senza chiamare il BeginGetRequestStream(AsyncCallback, Object) metodo .

-o-

ContentLength è maggiore di zero, ma l'applicazione non scrive tutti i dati promesso.

Abort() è stato chiamato in precedenza.

Esempio

Nell'esempio di codice seguente viene usato il BeginGetResponse metodo per effettuare una richiesta asincrona per una risorsa Internet.

Nota

Nel caso di richieste asincrone, è responsabilità dell'applicazione client implementare il proprio meccanismo di timeout. Nell'esempio di codice seguente viene illustrato come eseguire questa operazione.

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

Commenti

Cautela

WebRequest ServicePoint, HttpWebRequest, e WebClient sono obsoleti e non è consigliabile usarli per il nuovo sviluppo. Utilizzare invece HttpClient.

Il BeginGetResponse metodo avvia una richiesta asincrona per una risposta dalla risorsa Internet. Il metodo di callback asincrono usa il EndGetResponse metodo per restituire l'oggetto effettivo WebResponse.

Un ProtocolViolationException viene generato in diversi casi quando le proprietà impostate nella HttpWebRequest classe sono in conflitto. Questa eccezione si verifica se un'applicazione imposta la ContentLength proprietà e la SendChunked proprietà su truee quindi invia una richiesta HTTP GET. Questa eccezione si verifica se un'applicazione tenta di inviare blocchi a un server che supporta solo il protocollo HTTP 1.0, in cui non è supportato. Questa eccezione si verifica se un'applicazione tenta di inviare dati senza impostare la ContentLength proprietà o SendChunked è false quando il buffering è disabilitato e in una connessione keepalive (la KeepAlive proprietà è true).

Se viene generata un'eccezione WebException , utilizzare le Response proprietà e Status dell'eccezione per determinare la risposta dal server.

Il BeginGetResponse metodo richiede il completamento di alcune attività di installazione sincrone (risoluzione DNS, rilevamento proxy e connessione socket TCP, ad esempio) prima che questo metodo diventi asincrono. Di conseguenza, questo metodo non deve mai essere chiamato su un thread dell'interfaccia utente perché potrebbe richiedere molto tempo (fino a diversi minuti a seconda delle impostazioni di rete) per completare le attività di installazione sincrone iniziali prima che venga generata un'eccezione per un errore o il metodo abbia esito positivo.

Per altre informazioni sul pool di thread, vedere Pool di thread gestiti.

Nota

L'applicazione non può combinare metodi sincroni e asincroni per una determinata richiesta. Se si chiama il BeginGetRequestStream metodo , è necessario usare il BeginGetResponse metodo per recuperare la risposta.

Nota

Questo membro restituisce informazioni di traccia quando si abilita la traccia di rete nell'applicazione. Per altre informazioni, vedere Traccia di rete in .NET Framework.

Si applica a

Vedi anche