HttpWebRequest.BeginGetResponse(AsyncCallback, Object) Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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
Yang IAsyncResult mereferensikan permintaan asinkron untuk respons.
Pengecualian
Aliran sudah digunakan oleh panggilan sebelumnya ke BeginGetResponse(AsyncCallback, Object)
-atau-
TransferEncoding diatur ke nilai dan SendChunked adalah false.
-atau-
Kumpulan utas kehabisan utas.
Methodadalah GET atau HEAD, dan ContentLength lebih besar dari nol atau SendChunked .true
-atau-
KeepAlive adalah true, AllowWriteStreamBuffering adalah false, dan baik ContentLength -1, SendChunked adalah false dan Method adalah POST atau PUT.
-atau-
HttpWebRequest memiliki badan entitas tetapi BeginGetResponse(AsyncCallback, Object) metode dipanggil tanpa memanggil BeginGetRequestStream(AsyncCallback, Object) metode .
-atau-
ContentLength lebih besar dari nol, tetapi aplikasi tidak menulis semua data yang dijanjikan.
Abort() sebelumnya dipanggil.
Contoh
Contoh kode berikut menggunakan BeginGetResponse metode 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, , HttpWebRequestServicePoint, dan WebClient usang, dan Anda tidak boleh menggunakannya untuk pengembangan baru. Gunakan HttpClient sebagai gantinya.
Metode ini BeginGetResponse memulai permintaan asinkron untuk respons dari sumber daya Internet. Metode panggilan balik asinkron menggunakan EndGetResponse metode untuk mengembalikan aktual WebResponse.
ProtocolViolationException dilemparkan dalam beberapa kasus ketika properti yang ditetapkan pada HttpWebRequest kelas bertentangan. Pengecualian ini terjadi jika aplikasi mengatur ContentLength properti dan SendChunked properti 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 ContentLength properti atau SendChunked adalah false ketika buffering dinonaktifkan dan pada koneksi keepalive ( KeepAlive properti adalah true).
WebException Jika dilemparkan, gunakan Response properti dan Status pengecualian untuk menentukan respons dari server.
Metode ini 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 BeginGetRequestStream metode , Anda harus menggunakan BeginGetResponse metode 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.