4 Stimmen

Bester Ansatz für Timeout mit HttpWebRequest.BeginGetResponse

HttpWebRequest.BeginGetResponse beachtet keine Timeout-Eigenschaften von HttpWebRequest (Timeout oder ReadWriteTimeout).

Ich habe einige Ansätze gelesen, um die gleichen Ergebnisse zu erhalten, aber ich weiß nicht, ob es der beste Weg, es zu tun ist und wenn ich für einige Anrufe verwenden sollte oder ich kann es innerhalb von Schleifen skalieren (ich tue einen Webcrawler).

Das Wichtigste ist, dass mein Code zunächst nicht asynchron ist, ich brauche nur asynchron, weil meine Methode ein CancellationToken akzeptieren sollte.

Meine Sorge gilt WaitHandles und ThreadPool.RegisterWaitForSingleObject. Es ist nicht ein täglicher Code, dann weiß ich nicht, wenn ich Probleme in der nahen Zukunft haben kann.

private static void HandleCancellation(HttpWebRequest request, IAsyncResult getResponseResult, CancellationToken cancellationToken)
{
    using (WaitHandle requestHandle = getResponseResult.AsyncWaitHandle)
    {
        ThreadPool.RegisterWaitForSingleObject(requestHandle, TimeoutCallback, request, request.Timeout, true);

        //If request finish or cancellation is called
        WaitHandle.WaitAny(new[] {requestHandle, cancellationToken.WaitHandle});
    }

    //If cancellation was called
    if (cancellationToken.IsCancellationRequested)
    {
        request.Abort();
        cancellationToken.ThrowIfCancellationRequested();
    }
}

Aufrufen (wieder nicht asynchron)

IAsyncResult getResponseResult = request.BeginGetResponse(null, null);

HandleCancellation(request, getResponseResult, cancellationToken);

return (HttpWebResponse)request.EndGetResponse(getResponseResult);

Referenz: Besserer Ansatz bei der Verwaltung von mehreren WebRequest

3voto

Jim Mischel Punkte 125706

Die MSDN-Dokumentation für BeginGetResponse hat ein sehr gutes Beispiel für den Umgang mit Zeitüberschreitungen. Bei meinem Web-Crawler hat es ganz gut funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X