Поделиться через


HttpWebRequest.BeginGetResponse(AsyncCallback, Object) Метод

Определение

Начинает асинхронный запрос к интернет-ресурсу.

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

Параметры

callback
AsyncCallback

Делегат AsyncCallback.

state
Object

Объект состояния для этого запроса.

Возвращаемое значение

IAsyncResult, ссылающийся на асинхронный запрос ответа.

Исключения

Поток уже используется предыдущим вызовом BeginGetResponse(AsyncCallback, Object)

-или-

TransferEncoding задано значение, а SendChunkedfalse.

-или-

Пул потоков выходит из потоков.

Method является GET или HEAD, а ContentLength больше нуля или SendChunkedtrue.

-или-

KeepAlive true, AllowWriteStreamBufferingfalse, а ContentLength равно -1, SendChunkedfalse и Method — POST или PUT.

-или-

HttpWebRequest имеет тело сущности, но метод BeginGetResponse(AsyncCallback, Object) вызывается без вызова метода BeginGetRequestStream(AsyncCallback, Object).

-или-

ContentLength больше нуля, но приложение не записывает все обещанные данные.

Abort() ранее был вызван.

Примеры

В следующем примере кода используется метод BeginGetResponse для асинхронного запроса для ресурса Интернета.

Заметка

В случае асинхронных запросов клиентское приложение несет ответственность за реализацию собственного механизма времени ожидания. В следующем примере кода показано, как это сделать.

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

Комментарии

Осторожность

WebRequest, HttpWebRequest, ServicePointи WebClient устарели, и их не следует использовать для новой разработки. Вместо этого используйте HttpClient.

Метод BeginGetResponse запускает асинхронный запрос ответа из интернет-ресурса. Метод асинхронного обратного вызова использует метод EndGetResponse для возврата фактического WebResponse.

ProtocolViolationException возникает в нескольких случаях, когда свойства, заданные в классе HttpWebRequest, конфликтуют. Это исключение возникает, если приложение задает свойство ContentLength и свойство SendChunked для true, а затем отправляет HTTP-запрос GET. Это исключение возникает, если приложение пытается отправить блоки на сервер, поддерживающий протокол HTTP 1.0, где это не поддерживается. Это исключение возникает, если приложение пытается отправить данные без установки свойства ContentLength или SendChunkedfalse при отключении буферизации и при сохранении подключения (свойство KeepAlivetrue).

Если возникает WebException, используйте свойства Response и Status исключения, чтобы определить ответ с сервера.

Метод BeginGetResponse требует выполнения некоторых синхронных задач установки (разрешение DNS, обнаружение прокси-сервера и подключение сокета TCP), прежде чем этот метод станет асинхронным. В результате этот метод никогда не должен вызываться в потоке пользовательского интерфейса, так как может потребоваться значительное время (до нескольких минут в зависимости от параметров сети) для выполнения начальных синхронных задач установки, прежде чем возникает исключение для ошибки или метод завершается успешно.

Дополнительные сведения о пуле потоков см. в управляемого пула потоков.

Заметка

Приложение не может смешивать синхронные и асинхронные методы для конкретного запроса. При вызове метода BeginGetRequestStream необходимо использовать метод BeginGetResponse для получения ответа.

Заметка

Этот элемент выводит сведения о трассировке при включении трассировки сети в приложении. Дополнительные сведения см. в разделе трассировки сети в.NET Framework.

Применяется к

См. также раздел