HttpWebRequest.BeginGetResponse(AsyncCallback, Object) Metod

Definition

Påbörjar en asynkron begäran till en Internetresurs.

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

Parametrar

callback
AsyncCallback

Ombudet AsyncCallback .

state
Object

Tillståndsobjektet för den här begäran.

Returer

En IAsyncResult som refererar till den asynkrona begäran om ett svar.

Undantag

Strömmen används redan av ett tidigare anrop till BeginGetResponse(AsyncCallback, Object)

-eller-

TransferEncoding är inställt på ett värde och SendChunked är false.

-eller-

Trådpoolen börjar få slut på trådar.

Methodär GET eller HEAD och är antingen ContentLength större än noll eller SendChunked .true

-eller-

KeepAlive är true, AllowWriteStreamBuffering är false, och antingen ContentLength är -1, SendChunked är false och Method är POST eller PUT.

-eller-

HttpWebRequest Har en entitetstext men BeginGetResponse(AsyncCallback, Object) metoden anropas utan att anropa BeginGetRequestStream(AsyncCallback, Object) metoden.

-eller-

ContentLength är större än noll, men programmet skriver inte alla utlovade data.

Abort() anropades tidigare.

Exempel

I följande kodexempel används BeginGetResponse metoden för att göra en asynkron begäran för en Internetresurs.

Note

När det gäller asynkrona begäranden är det klientprogrammets ansvar att implementera sin egen timeout-mekanism. I följande kodexempel visas hur du gör det.

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

Kommentarer

Caution

WebRequest, HttpWebRequest, ServicePoint, och WebClient är föråldrade och du bör inte använda dem för ny utveckling. Använd HttpClient i stället.

Metoden BeginGetResponse startar en asynkron begäran om ett svar från Internetresursen. Den asynkrona motringningsmetoden använder EndGetResponse metoden för att returnera den faktiska WebResponse.

A ProtocolViolationException genereras i flera fall när egenskaperna som anges i klassen står i HttpWebRequest konflikt. Det här undantaget inträffar om ett program anger ContentLength egenskapen och SendChunked egenskapen till trueoch sedan skickar en HTTP GET-begäran. Det här undantaget inträffar om ett program försöker skicka segmenterade till en server som endast stöder HTTP 1.0-protokoll, där detta inte stöds. Det här undantaget inträffar om ett program försöker skicka data utan att ange ContentLength egenskapen eller SendChunked är false när buffring är inaktiverad och på en keepalive-anslutning (egenskapen KeepAlive är true).

Om en WebException genereras använder du Response egenskaperna och Status för undantaget för att fastställa svaret från servern.

Metoden BeginGetResponse kräver vissa synkrona konfigurationsuppgifter att slutföra (DNS-matchning, proxyidentifiering och TCP-socketanslutning, till exempel) innan den här metoden blir asynkron. Därför bör den här metoden aldrig anropas på en användargränssnittstråd eftersom det kan ta lång tid (upp till flera minuter beroende på nätverksinställningar) att slutföra de inledande synkrona installationsuppgifterna innan ett undantag för ett fel utlöses eller så lyckas metoden.

Mer information om trådpoolen finns i Den hanterade trådpoolen.

Note

Programmet kan inte blanda synkrona och asynkrona metoder för en viss begäran. Om du anropar BeginGetRequestStream metoden måste du använda BeginGetResponse metoden för att hämta svaret.

Note

Den här medlemmen matar ut spårningsinformation när du aktiverar nätverksspårning i ditt program. Mer information finns i Network Tracing i .NET Framework.

Gäller för

Se även