HttpWebRequest-Timeouts Nach Zehn Aufeinander Folgende Anfragen
Schreibe ich einen web-crawler für einen bestimmten Standort. Die Anwendung ist ein VB.Net Windows-Forms-Anwendung, die nicht Verwendung mehrerer threads - jeder web-Anforderung aufeinander. Doch nach zehn erfolgreichen Seitenaufrufen jeder nachfolgenden Anforderung Zeitüberschreitung.
Habe ich überprüft, das ähnliche Fragen hier schon geschrieben auf SO und umgesetzt haben, die empfohlenen Techniken in meine GetPage routine, wie unten gezeigt:
Public Function GetPage(ByVal url As String) As String
Dim result As String = String.Empty
Dim uri As New Uri(url)
Dim sp As ServicePoint = ServicePointManager.FindServicePoint(uri)
sp.ConnectionLimit = 100
Dim request As HttpWebRequest = WebRequest.Create(uri)
request.KeepAlive = False
request.Timeout = 15000
Try
Using response As HttpWebResponse = DirectCast(request.GetResponse, HttpWebResponse)
Using dataStream As Stream = response.GetResponseStream()
Using reader As New StreamReader(dataStream)
If response.StatusCode <> HttpStatusCode.OK Then
Throw New Exception("Got response status code: " + response.StatusCode)
End If
result = reader.ReadToEnd()
End Using
End Using
response.Close()
End Using
Catch ex As Exception
Dim msg As String = "Error reading page """ & url & """. " & ex.Message
Logger.LogMessage(msg, LogOutputLevel.Diagnostics)
End Try
Return result
End Function
Habe ich etwas verpasst? Bin ich nicht schließen oder die Entsorgung eines Objekts werden sollten? Es scheint seltsam, dass es immer passiert, nach zehn aufeinander folgenden Anfragen.
Hinweise:
-
In den Konstruktor für die Klasse, in der diese Methode befindet, habe ich Folgendes:
ServicePointManager.DefaultConnectionLimit = 100
-
Wenn ich KeepAlive zu wahren, die timeouts beginnen nach fünf Anfragen.
-
Alle Anforderungen für Seiten in der gleichen domain.
BEARBEITEN
Habe ich noch eine Verzögerung zwischen den einzelnen web-Anfrage, die zwischen zwei und sieben Sekunden, so dass ich nicht zu sein scheinen "hämmern" der Website oder der Versuch einer DOS-Attacke. Allerdings ist das problem immer noch Auftritt.
- Was ist der Produkt-name und version des web-server-hosting der app?
- Es gibt 10 verbindungen zu IIS 5
- Ich bin neugierig - hast du jemals festzunageln die Ursache? Ich bin mit den gleichen Problemen.
- Nein, niemals hat man die Krux an der Sache. Das ist, warum ich nahm die Denial-of-Service (DOS) - Schutz, da war es die einzige Verbleibende Antwort, die keinen Sinn gemacht.
- Ich bin immer ein sehr ähnliches Problem schlagen die twitter-API mit HttpWebRequest. Noch seltsamer wird es nicht passieren wenn ich fiddler?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, die Website hat eine Art von DOS-Schutz, die startet, wenn er getroffen wird, mit einer Anzahl von rapis-Anfragen. Sie möchten möglicherweise versuchen, das festlegen der UserAgent-auf dem webrequest.
Ich lief in dieses Problem heute und meine Auflösung war zu gewährleisten, dass die Antwort war immer geschlossen.
Ich denke, dass Sie brauchen, um in einer Reaktion.Close () -, bevor Sie werfen Sie Ihre Ausnahme innerhalb der mit.
Using response
gewährleistet Reaktion wird geschlossen.Using response
achten sollten, schließen Dinge richtig. Danke für die Antwort obwohl.Ich habe folgende Lösung und es funktioniert für mich. Hoffe, es hilft dir auch.
Erklären "global" auf die form der Variablen.
Dann verwenden Sie immer
myHttpWebResponse.Close();
nach jeder Verbindung.Ich weiß, das ist eine alte Frage, aber ich hatte vor kurzem dieses problem selbst (aufgrund meiner Zielumgebung mit 4.0, und nicht, dass Sie keine externen assembly-Referenzen)
Habe ich jedoch einige Graben und fand ein Update von Sorten und ist sehr interessant .NETTO-innen-Funktionsweise Perspektive
ServicePointManager intern verarbeitet die eigentliche HTTP-Anfrage erstellt, die von mehreren HttpWebRequest-Objekte ..problem ist, diese nicht bekommen, automatisch geschlossen und HttpWebRequest nicht bekommt Müll abgeholt sofort
Also ich fand etwas sehr Interessantes – wenn ich HttpWebRequest-Instanz-Ebene-variable UND I-force garbage collection nach dem Umschalten der Referenz aus ...es funktioniert (ohne das DefaultConnectionLimit = 100 hack)
Bevor ich war, erstellen Sie eine neue lokale variable jedes mal, wenn in der Methode. Das schien zu beheben mein problem - wohl ein wenig zu spät, um Ihnen zu helfen, aber dachte, ich würde teilen, falls jemand anderes auf diesen
Wenn der server eine Datenbank und nicht in der Nähe jeder Datenbank Verbindung richtig, erhalten Sie eine Fehlermeldung (z.B. statuscode 502), wenn die max. Verbindung begrenzte erreicht ist (bis die Datenbank connection timeout).
Eine Lösung ist in diesem Fall nur auf "Standby" - das webrequest-thread für eine bestimmte Zeit.
Außerdem sollten Sie sicherstellen, dass jede Anfrage und response-stream wird geschlossen nach der Bearbeitung (im besten Fall durch die Verwendung einer 'Mit' - Anweisung):
myRequest.Verbindung = "Schließen";
wird der server schließen die Verbindung, die die Verbindungs-manager schließen und die Verbindung zu.