Sdílet prostřednictvím


HttpWebRequest.BeginGetResponse(AsyncCallback, Object) Metoda

Definice

Zahájí asynchronní požadavek na internetový prostředek.

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

Parametry

callback
AsyncCallback

Delegát AsyncCallback.

state
Object

Objekt stavu pro tento požadavek.

Návraty

IAsyncResult, která odkazuje na asynchronní požadavek na odpověď.

Výjimky

Stream se už používá předchozím voláním BeginGetResponse(AsyncCallback, Object)

-nebo-

TransferEncoding je nastavena na hodnotu a SendChunked je false.

-nebo-

Fondu vláken dochází z vláken.

Method je FUNKCE GET nebo HEAD a ContentLength je větší než nula nebo SendChunked je true.

-nebo-

KeepAlive je true, AllowWriteStreamBuffering je falsea ContentLength je -1, SendChunked je false a Method je POST nebo PUT.

-nebo-

HttpWebRequest má tělo entity, ale BeginGetResponse(AsyncCallback, Object) metoda je volána bez volání metody BeginGetRequestStream(AsyncCallback, Object).

-nebo-

ContentLength je větší než nula, ale aplikace nezapisuje všechna slíbená data.

Abort() byl dříve volána.

Příklady

Následující příklad kódu používá metodu BeginGetResponse k vytvoření asynchronního požadavku na internetový prostředek.

Poznámka

V případě asynchronních požadavků je odpovědností klientské aplikace implementovat vlastní mechanismus vypršení časového limitu. Následující příklad kódu ukazuje, jak to udělat.

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

Poznámky

Opatrnost

WebRequest, HttpWebRequest, ServicePointa WebClient jsou zastaralé a neměli byste je používat pro nový vývoj. Místo toho použijte HttpClient.

Metoda BeginGetResponse spustí asynchronní požadavek na odpověď z internetového prostředku. Asynchronní metoda zpětného volání používá metodu EndGetResponse k vrácení skutečné WebResponse.

ProtocolViolationException je vyvolán v několika případech, když jsou vlastnosti nastavené na HttpWebRequest třídy konfliktní. K této výjimce dochází v případě, že aplikace nastaví vlastnost ContentLength a vlastnost SendChunked na truea pak odešle požadavek HTTP GET. K této výjimce dochází v případě, že se aplikace pokusí odeslat blok dat na server, který podporuje pouze protokol HTTP 1.0, kde to není podporováno. K této výjimce dochází, pokud se aplikace pokusí odeslat data bez nastavení vlastnosti ContentLength nebo SendChunked je false při zakázání ukládání do vyrovnávací paměti a při zachování připojení (vlastnost KeepAlive je true).

Pokud dojde k vyvolání WebException, pomocí vlastností Response a Status výjimky určete odpověď ze serveru.

Metoda BeginGetResponse vyžaduje dokončení některých synchronních úloh nastavení (překlad DNS, detekce proxy serveru a připojení soketu TCP), než se tato metoda stane asynchronní. V důsledku toho by tato metoda neměla být nikdy volána ve vlákně uživatelského rozhraní, protože může trvat poměrně dlouho (až několik minut v závislosti na nastavení sítě) k dokončení počáteční synchronní úlohy nastavení před vyvoláním výjimky chyby nebo úspěšné metody.

Další informace o fondu vláken najdete v tématu Fond spravovaných vláken.

Poznámka

Vaše aplikace nemůže kombinovat synchronní a asynchronní metody pro konkrétní požadavek. Pokud voláte metodu BeginGetRequestStream, musíte k načtení odpovědi použít metodu BeginGetResponse.

Poznámka

Tento člen vypíše informace o trasování, když ve své aplikaci povolíte trasování sítě. Další informace naleznete v tématu Trasování sítě v rozhraní .NET Framework.

Platí pro

Viz také