HttpWebRequest.BeginGetResponse(AsyncCallback, Object) Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Begint een asynchrone aanvraag voor een internetresource.
public:
override IAsyncResult ^ BeginGetResponse(AsyncCallback ^ callback, System::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
Parameters
- callback
- AsyncCallback
De AsyncCallback gedelegeerde.
- state
- Object
Het statusobject voor deze aanvraag.
Retouren
Een IAsyncResult die verwijst naar de asynchrone aanvraag voor een antwoord.
Uitzonderingen
De stream wordt al gebruikt door een eerdere aanroep naar BeginGetResponse(AsyncCallback, Object)
– of –
TransferEncoding is ingesteld op een waarde en SendChunked is false.
– of –
De threadpool heeft onvoldoende threads.
Method is GET of HEAD en ContentLength is groter dan nul of SendChunked is true.
– of –
KeepAliveis true, AllowWriteStreamBuffering is , en falseContentLength is - 1, SendChunked is false en Method is POST of PUT.
– of –
De HttpWebRequest entiteit heeft een entiteitstekst, maar de BeginGetResponse(AsyncCallback, Object) methode wordt aangeroepen zonder de methode aan te BeginGetRequestStream(AsyncCallback, Object) roepen.
– of –
De ContentLength waarde is groter dan nul, maar de toepassing schrijft niet alle beloofde gegevens.
Abort() werd eerder gebeld.
Voorbeelden
In het volgende codevoorbeeld wordt de BeginGetResponse methode gebruikt om een asynchrone aanvraag voor een internetresource te maken.
Note
In het geval van asynchrone aanvragen is het de verantwoordelijkheid van de clienttoepassing om een eigen time-outmechanisme te implementeren. In het volgende codevoorbeeld ziet u hoe u dit doet.
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();
}
}
}
Opmerkingen
Caution
WebRequest, HttpWebRequest, ServicePointen WebClient zijn verouderd en u moet ze niet gebruiken voor nieuwe ontwikkeling. Gebruik in plaats daarvan HttpClient.
De BeginGetResponse methode start een asynchrone aanvraag voor een reactie van de internetresource. De asynchrone callback-methode gebruikt de EndGetResponse methode om de werkelijke WebResponsewaarde te retourneren.
Er ProtocolViolationException wordt een gegenereerd in verschillende gevallen wanneer de eigenschappen die zijn ingesteld op de HttpWebRequest klasse conflicteren. Deze uitzondering treedt op als een toepassing de ContentLength eigenschap en de SendChunked eigenschap trueinstelt op en vervolgens een HTTP GET-aanvraag verzendt. Deze uitzondering treedt op als een toepassing probeert gesegmenteerd te verzenden naar een server die alleen http 1.0-protocol ondersteunt, waarbij dit niet wordt ondersteund. Deze uitzondering treedt op als een toepassing probeert gegevens te verzenden zonder de ContentLength eigenschap in te stellen of wanneer buffering SendChunkedfalse is uitgeschakeld en bij een keepalive-verbinding (de KeepAlive eigenschap is true).
Als er een WebException optreedt, gebruikt u de Response en Status eigenschappen van de uitzondering om het antwoord van de server te bepalen.
Voor de BeginGetResponse methode zijn enkele synchrone installatietaken vereist om te voltooien (DNS-omzetting, proxydetectie en TCP-socketverbinding, bijvoorbeeld) voordat deze methode asynchroon wordt. Als gevolg hiervan mag deze methode nooit worden aangeroepen op een gebruikersinterfacethread, omdat het veel tijd kan duren (tot enkele minuten afhankelijk van de netwerkinstellingen) om de initiële synchrone installatietaken te voltooien voordat een uitzondering voor een fout wordt gegenereerd of de methode slaagt.
Zie de beheerde threadpool voor meer informatie over de threadgroep.
Note
Uw toepassing kan geen synchrone en asynchrone methoden combineren voor een bepaalde aanvraag. Als u de BeginGetRequestStream methode aanroept, moet u de BeginGetResponse methode gebruiken om het antwoord op te halen.
Note
Dit lid voert traceringsgegevens uit wanneer u netwerktracering inschakelt in uw toepassing. Zie Network Tracing in the .NET Framework voor meer informatie.