Bagikan melalui


HttpWebRequest.BeginGetResponse(AsyncCallback, Object) Metode

Definisi

Memulai permintaan asinkron ke sumber daya 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

Parameter

callback
AsyncCallback

Delegasi AsyncCallback.

state
Object

Objek status untuk permintaan ini.

Mengembalikan

IAsyncResult yang mereferensikan permintaan asinkron untuk respons.

Pengecualian

Aliran sudah digunakan oleh panggilan sebelumnya ke BeginGetResponse(AsyncCallback, Object)

-atau-

TransferEncoding diatur ke nilai dan SendChunkedfalse.

-atau-

Kumpulan utas kehabisan utas.

Method GET atau HEAD, dan ContentLength lebih besar dari nol atau SendChunkedtrue.

-atau-

KeepAlive true, AllowWriteStreamBufferingfalse, dan ContentLength -1, SendChunkedfalse dan Method POST atau PUT.

-atau-

HttpWebRequest memiliki badan entitas tetapi metode BeginGetResponse(AsyncCallback, Object) dipanggil tanpa memanggil metode BeginGetRequestStream(AsyncCallback, Object).

-atau-

ContentLength lebih besar dari nol, tetapi aplikasi tidak menulis semua data yang dijanjikan.

Abort() sebelumnya dipanggil.

Contoh

Contoh kode berikut menggunakan metode BeginGetResponse untuk membuat permintaan asinkron untuk sumber daya Internet.

Nota

Dalam kasus permintaan asinkron, adalah tanggung jawab aplikasi klien untuk menerapkan mekanisme waktu habisnya sendiri. Contoh kode berikut menunjukkan cara melakukannya.

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

Keterangan

Hati

WebRequest, HttpWebRequest, ServicePoint, dan WebClient usang, dan Anda tidak boleh menggunakannya untuk pengembangan baru. Gunakan HttpClient sebagai gantinya.

Metode BeginGetResponse memulai permintaan asinkron untuk respons dari sumber daya Internet. Metode panggilan balik asinkron menggunakan metode EndGetResponse untuk mengembalikan WebResponseaktual .

ProtocolViolationException dilemparkan dalam beberapa kasus ketika properti yang diatur pada kelas HttpWebRequest bertentangan. Pengecualian ini terjadi jika aplikasi mengatur properti ContentLength dan properti SendChunked ke true, lalu mengirim permintaan HTTP GET. Pengecualian ini terjadi jika aplikasi mencoba mengirim potongan ke server yang hanya mendukung protokol HTTP 1.0, di mana ini tidak didukung. Pengecualian ini terjadi jika aplikasi mencoba mengirim data tanpa mengatur properti ContentLength atau SendChunkedfalse saat buffering dinonaktifkan dan pada koneksi keepalive (properti KeepAlivetrue).

Jika WebException dilemparkan, gunakan properti Response dan Status pengecualian untuk menentukan respons dari server.

Metode BeginGetResponse memerlukan beberapa tugas penyiapan sinkron untuk diselesaikan (resolusi DNS, deteksi proksi, dan koneksi soket TCP, misalnya) sebelum metode ini menjadi asinkron. Akibatnya, metode ini tidak boleh dipanggil pada utas antarmuka pengguna (UI) karena mungkin membutuhkan waktu yang cukup lama (hingga beberapa menit tergantung pada pengaturan jaringan) untuk menyelesaikan tugas penyiapan sinkron awal sebelum pengecualian untuk kesalahan dilemparkan atau metode berhasil.

Untuk mempelajari selengkapnya tentang kumpulan utas, lihat Kumpulan utas terkelola.

Nota

Aplikasi Anda tidak dapat mencampur metode sinkron dan asinkron untuk permintaan tertentu. Jika Anda memanggil metode BeginGetRequestStream, Anda harus menggunakan metode BeginGetResponse untuk mengambil respons.

Nota

Anggota ini mengeluarkan informasi pelacakan saat Anda mengaktifkan pelacakan jaringan di aplikasi Anda. Untuk informasi selengkapnya, lihat Pelacakan Jaringan di .NET Framework.

Berlaku untuk

Lihat juga

  • Elemen DefaultProxy (Pengaturan Jaringan)