maandag 23 juli 2007

Webscreen scraping III

Een httpwebrequest is een bijzondere klasse.
Het http protocol is geen makkelijk protocol en kan afhankelijk van de protocol instellingen zowel als server en client verschillen gedrag vertonen.

Bij het herhaaldelijk gebruiken van een webrequest ging er ergens iets mis.
System.Net.WebException: The underlying connection was closed:

Oplossingen die niet werkten:
System.Threading.Thread.Sleep(2000)
--1000 verbindingen direct achter elkaar vind geen enkele server/router leuk
ServicePointManager.DefaultConnectionLimit = 10
--meer dan standaard 2 (mischien een connectie die busy was oid)
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 Or SecurityProtocolType.Tls
--we werken via HTTPS mischien helpt dat
lHttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
lHttpWebRequest.SendChunked = True
--mischien een fout in certificaat handeling(incomplete transmissie) daarom chunked ipv streamed
lHttpWebRequest.Method = "GET"
--get ipv post ivm met certificaat fout (de fout lag zeker bij een post aktie)
lHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 1.0.3705; .NET CLR 3.0.04506.30; MEGAUPLOAD 1.0)"
--een moderne browser string (alles anders dan IEXplore deed het zowiezo niet)
lHttpWebRequest.Timeout = 30000
--timeout maakt geen verschil
lHttpWebRequest.KeepAlive = False
--keep conneciton alive (als de verbinding open blijft kan .Net denken dat hij open staat terwlijk de server hem allang dicht heeft gegooid)
'lHttpWebRequest.ProtocolVersion = HttpVersion.Version11
currentServicePoint = lHttpWebRequest.ServicePoint
currentServicePoint.MaxIdleTime = 5000
--max idle time for connectie daarna moet hij opnieuw gemaakt worden
currentServicePoint.Expect100Continue = False
--er is een fout in .Net dat een 100 continue en een 100 close melding door elkaar gehaald worden

'vanaf hier standaard code
'url = "https://blablabla.com
lHttpWebResponse = CType(lHttpWebRequest.GetResponse, HttpWebResponse)
lHttpWebResponseStream = lHttpWebRequest.GetResponse.GetResponseStream
str = lHttpWebResponseStream

Geen opmerkingen: