Freigeben über


HttpWebRequest.BeginGetResponse(AsyncCallback, Object) Methode

Definition

Startet eine asynchrone Anforderung an eine Internetressource.

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

Die AsyncCallback Stellvertretung.

state
Object

Das Statusobjekt für diese Anforderung.

Gibt zurück

Eine IAsyncResult, die auf die asynchrone Anforderung für eine Antwort verweist.

Ausnahmen

Der Datenstrom wird bereits von einem vorherigen Aufruf von BeginGetResponse(AsyncCallback, Object) verwendet.

-oder-

TransferEncoding wird auf einen Wert festgelegt, und SendChunked ist false.

-oder-

Der Threadpool läuft aus Threads heraus.

Method ist GET oder HEAD, und entweder ist ContentLength größer als Null oder SendChunked ist true.

-oder-

KeepAlive ist true, AllowWriteStreamBuffering ist false, und entweder ContentLength ist -1, SendChunked ist false und Method POST oder PUT ist.

-oder-

Die HttpWebRequest verfügt über einen Entitätstext, die BeginGetResponse(AsyncCallback, Object)-Methode wird jedoch aufgerufen, ohne die BeginGetRequestStream(AsyncCallback, Object)-Methode aufzurufen.

-oder-

Die ContentLength ist größer als Null, aber die Anwendung schreibt nicht alle versprochenen Daten.

Abort() wurde zuvor aufgerufen.

Beispiele

Im folgenden Codebeispiel wird die BeginGetResponse-Methode verwendet, um eine asynchrone Anforderung für eine Internetressource zu erstellen.

Anmerkung

Im Falle asynchroner Anforderungen liegt es in der Verantwortung der Clientanwendung, einen eigenen Timeoutmechanismus zu implementieren. Das folgende Codebeispiel zeigt, wie sie ausgeführt wird.

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

Hinweise

Vorsicht

WebRequest, HttpWebRequest, ServicePointund WebClient sind veraltet, und Sie sollten sie nicht für die neue Entwicklung verwenden. Verwenden Sie stattdessen HttpClient.

Die methode BeginGetResponse startet eine asynchrone Anforderung für eine Antwort von der Internetressource. Die asynchrone Rückrufmethode verwendet die EndGetResponse-Methode, um den tatsächlichen WebResponsezurückzugeben.

Ein ProtocolViolationException wird in mehreren Fällen ausgelöst, wenn die für die HttpWebRequest Klasse festgelegten Eigenschaften in Konflikt stehen. Diese Ausnahme tritt auf, wenn eine Anwendung die ContentLength-Eigenschaft und die SendChunked-Eigenschaft auf truefestlegt und dann eine HTTP GET-Anforderung sendet. Diese Ausnahme tritt auf, wenn eine Anwendung versucht, einen Block an einen Server zu senden, der nur das HTTP 1.0-Protokoll unterstützt, wobei dies nicht unterstützt wird. Diese Ausnahme tritt auf, wenn eine Anwendung versucht, Daten zu senden, ohne die eigenschaft ContentLength festzulegen, oder die SendChunked beim Deaktivieren der Pufferung false und bei einer Keepalive-Verbindung (die eigenschaft KeepAlive ist true).

Wenn ein WebException ausgelöst wird, verwenden Sie die Response und Status Eigenschaften der Ausnahme, um die Antwort vom Server zu ermitteln.

Für die BeginGetResponse-Methode sind einige synchrone Setupaufgaben erforderlich (z. B. DNS-Auflösung, Proxyerkennung und TCP-Socketverbindung), bevor diese Methode asynchron wird. Daher sollte diese Methode niemals für einen Ui-Thread aufgerufen werden, da es je nach Netzwerkeinstellungen bis zu mehrere Minuten dauern kann, bis die anfänglichen synchronen Einrichtungsaufgaben abgeschlossen werden, bevor eine Ausnahme für einen Fehler ausgelöst wird oder die Methode erfolgreich ist.

Weitere Informationen zum Threadpool finden Sie unter Der verwaltete Threadpool.

Anmerkung

Ihre Anwendung kann keine synchronen und asynchronen Methoden für eine bestimmte Anforderung kombinieren. Wenn Sie die BeginGetRequestStream-Methode aufrufen, müssen Sie die BeginGetResponse-Methode verwenden, um die Antwort abzurufen.

Anmerkung

Dieses Mitglied gibt Ablaufverfolgungsinformationen aus, wenn Sie die Netzwerkablaufverfolgung in Ihrer Anwendung aktivieren. Weitere Informationen finden Sie unter Netzwerkablaufverfolgung in .NET Framework.

Gilt für:

Weitere Informationen