HttpWebRequest.BeginGetResponse(AsyncCallback, Object) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Rozpoczyna żądanie asynchroniczne do zasobu internetowego.
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
Delegat AsyncCallback.
- state
- Object
Obiekt stanu dla tego żądania.
Zwraca
IAsyncResult odwołujący się do asynchronicznego żądania odpowiedzi.
Wyjątki
Strumień jest już używany przez poprzednie wywołanie do BeginGetResponse(AsyncCallback, Object)
-lub-
TransferEncoding jest ustawiona na wartość, a SendChunked jest false
.
-lub-
Pula wątków kończy się z wątków.
Method to GET lub HEAD, a ContentLength jest większa niż zero lub SendChunked jest true
.
-lub-
KeepAlive jest true
, AllowWriteStreamBuffering jest false
, a ContentLength wynosi -1, SendChunked jest false
, a Method jest POST lub PUT.
-lub-
HttpWebRequest ma treść jednostki, ale metoda BeginGetResponse(AsyncCallback, Object) jest wywoływana bez wywoływania metody BeginGetRequestStream(AsyncCallback, Object).
-lub-
ContentLength jest większa niż zero, ale aplikacja nie zapisuje wszystkich obiecanych danych.
Abort() wcześniej wywoływano.
Przykłady
W poniższym przykładzie kodu użyto metody BeginGetResponse w celu utworzenia asynchronicznego żądania dla zasobu internetowego.
Nuta
W przypadku żądań asynchronicznych jest to odpowiedzialność aplikacji klienckiej za zaimplementowanie własnego mechanizmu przekroczenia limitu czasu. Poniższy przykład kodu pokazuje, jak to zrobić.
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();
}
}
}
Uwagi
Ostrożność
WebRequest
, HttpWebRequest
, ServicePoint
i WebClient
są przestarzałe i nie należy ich używać do tworzenia nowych aplikacji. Zamiast tego użyj HttpClient.
Metoda BeginGetResponse uruchamia asynchroniczne żądanie odpowiedzi z zasobu internetowego. Metoda asynchronicznego wywołania zwrotnego używa metody EndGetResponse, aby zwrócić rzeczywistą WebResponse.
ProtocolViolationException jest zgłaszany w kilku przypadkach, gdy właściwości ustawione w klasie HttpWebRequest są sprzeczne. Ten wyjątek występuje, jeśli aplikacja ustawia właściwość ContentLength i właściwość SendChunked na true
, a następnie wysyła żądanie HTTP GET. Ten wyjątek występuje, jeśli aplikacja próbuje wysłać fragmentowane do serwera, który obsługuje tylko protokół HTTP 1.0, gdzie nie jest to obsługiwane. Ten wyjątek występuje, jeśli aplikacja próbuje wysłać dane bez ustawienia właściwości ContentLength lub SendChunked jest false
podczas buforowania jest wyłączona, a w połączeniu na żywo (właściwość KeepAlive jest true
).
Jeśli zostanie zgłoszony WebException, użyj właściwości Response i Status wyjątku, aby określić odpowiedź z serwera.
Metoda BeginGetResponse wymaga wykonania niektórych synchronicznych zadań konfiguracji (na przykład rozpoznawania nazw DNS, wykrywania serwera proxy i połączenia gniazda TCP), zanim ta metoda stanie się asynchroniczna. W związku z tym ta metoda nigdy nie powinna być wywoływana w wątku interfejsu użytkownika, ponieważ wykonanie początkowych zadań konfiguracji synchronicznych może zająć dużo czasu (do kilku minut) lub metoda zakończy się powodzeniem.
Aby dowiedzieć się więcej o puli wątków, zobacz Zarządzana pula wątków.
Nuta
Aplikacja nie może mieszać metod synchronicznych i asynchronicznych dla określonego żądania. Jeśli wywołasz metodę BeginGetRequestStream, musisz użyć metody BeginGetResponse, aby pobrać odpowiedź.
Nuta
Ten element członkowski generuje informacje śledzenia po włączeniu śledzenia sieci w aplikacji. Aby uzyskać więcej informacji, zobacz Śledzenie sieci w programie .NET Framework.