Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

[vb.net]WebRequest hangt soms.

Pagina: 1
Acties:

  • Damic
  • Registratie: september 2003
  • Nu online

Damic

Afwezig soms

Topicstarter
Na veel proberen en zelf zoeken weet ik het niet meer.

Ik heb een programma en dat haalt data op van een website maar doet ook 1 post ernaar (login) dit werkt allemaal feilloos maar als de verbinding traag of brak (torrent als vb) is dan wilt ie wel eens vast lopen op geen response, zelfs geen timeout (wat wel soms werkt, deze staat trouwens op 10s).

Dus om het kort als overzicht te maken:
1. haal een pagina op om te zien of ik wel kan inloggen zoja ga verder anders exit
2. ga naar de inlog pagina en login (webform)
3. gebruik de redirect dat je terug krijgt
4. Zie welk abbo je hebt en navigeer naar de juiste pagina
5. haal daar de data op en sluit alles terug af (+gc.collect)
6. wacht minimum 1 minuut voor dat de gebruiker terug kan verversen (=menu.enable=false)

Als je dus te snel terug een verbinding aanvraagt gaat ie al bij stap 1 in lock (hij stopt ermee, maar blijft wel draaien zonder fout melding), door te wachten op een response (lijn 35), dit is al grotendeels opgelost met de timeout, maar vandaag had ie het weer (torrent stond nog open).

Wat ik dus al geprobeerd heb is dus met die timout te verminderen en op 10s is dat doenbaar maar toch blijft ie soms hangen.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Function http_request(ByVal Uri As String, Optional ByVal sParameters As String = "", Optional ByVal bUseForm As Boolean = False) As String
    Dim byteData As Byte() = encoding.GetBytes(sParameters)
    If Not bUseForm And (sParameters <> "") Then Uri &= IIf(Uri.LastIndexOf("?") > 0, "&", "?") & sParameters

    Add2Log("Http_request: " & Uri)
    Dim thePage As String = ""

    Try
        Dim postReq As HttpWebRequest = DirectCast(WebRequest.Create(Uri), HttpWebRequest)
        With postReq
            .Timeout = 10000
            .ServicePoint.ConnectionLeaseTimeout = .Timeout
            .ServicePoint.MaxIdleTime = 5000
            .CookieContainer = tempCookies
            .Referer = URI_MT_USAGE
            .UserAgent = "Mozilla/5.0 (Windows; U; " & Environment.OSVersion.ToString & "; ru; rv:1.9.2.3)"
            .Accept = "text/plain, text/html"
            .ContentLength = byteData.Length
            .KeepAlive = false
            .AllowAutoRedirect = True
            .ContentType = "application/x-www-form-urlencoded"
            .Method = "GET"
            .Proxy = Nothing
            If bUseForm Then
                .Method = "POST"
                Dim postreqstream As Stream = postReq.GetRequestStream()
                postreqstream.Write(byteData, 0, byteData.Length)
                Application.DoEvents()
                postreqstream.Flush()
                postreqstream.Close()
                postreqstream.Dispose()
            End If
        End With

        Using postresponse As HttpWebResponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
            If postresponse.StatusCode = HttpStatusCode.OK Then
                If Not bCookieSet Then
                    tempCookies.Add(postresponse.Cookies)
                    bCookieSet = True
                End If
                Dim postreqreader As New StreamReader(postresponse.GetResponseStream())
                thePage = postreqreader.ReadToEnd
                '-clean up
                postreqreader.Close()
                postreqreader.Dispose()
                postreqreader = Nothing
            Else
                thePage = ""
                Add2Log("HTTP_ERROR_CODE::" & postresponse.StatusCode & "::" & postresponse.StatusDescription)
            End If
            postresponse.Close()
            ' CType(postresponse, IDisposable).Dispose()
        End Using
    Catch ex As WebException
        bTimeOut = True
        Add2Log("HTTP_REQUEST::Timeout")
        thePage = "0" & ex.Message
    Catch ex As Exception
        Add2Log("HTTP_REQUEST::Error::" & ex.Message)
        thePage = "Err: " & ex.Message
    Finally

    End Try
    If DEBUG And DEBUG_HTML Then Add2Log(thePage)
    Return thePage
End Function


Nog iemand een idee wat er verkeerd gaat?

[Voor 63% gewijzigd door Damic op 23-04-2015 19:34]

Ik kan vanalles en nog wat maar niets te goei, klinkt bekent?? Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


  • RobIII
  • Registratie: december 2001
  • Laatst online: 15:04

RobIII

Admin Devschuur®

^ Romeinse 3 ja!

Wil je code a.u.b. voortaan gewoon in je topic plaatsen m.b.v. code tags? Verder: wat heb je zélf al geprobeerd / gezocht / gevonden? Heb je al gedebugged (Debuggen: Hoe doe ik dat?)? Wat kwam daar uit / waren je bevindingen? Verder vind ik je probleembeschrijving op z'n minst erg karig en onduidelijk (wat versta je precies onder "lock", "vast lopen", welke exception(s) krijg je precies etc.); daar kan ook e.e.a. nog aan verduidelijkt / bijgeschaafd worden. Waarvan dus bij deze het vriendelijke verzoek dat in je topicstart alsnog erbij te editten en aan te passen op de zaken die ik eerder noemde ;)

[Voor 40% gewijzigd door RobIII op 22-04-2015 22:03]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • Damic
  • Registratie: september 2003
  • Nu online

Damic

Afwezig soms

Topicstarter
Ha ok 1 van de vorige keren kreeg ik het verwijt dat ik de code ergens anders moest posten omdat het te groot was :|

Debuggen zou handig zijn als ie een fout melding gaf, maar dat doe ie niet, zit gewoon te wachten op iets en als je dan zelf iets doet (bvb menu openen) dan slaat ie vast. Dus geen exceptions anders kon ik daar wel mee verder.

Ik kan vanalles en nog wat maar niets te goei, klinkt bekent?? Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


  • Mostrow
  • Registratie: januari 2011
  • Laatst online: 11:25
Ik denk dat Rob eerder bedoelde dat je eens wat breakpoints moest zetten in het stukje code waar het (vermoedelijk) fout gaat?

Wanneer deze breakpoints worden geraakt kun je door de code stappen en zien wat er gebeurt / fout gaat.

En als je met vastlopen een niet reagerend formulier bedoelt, dan zou je de routine mogelijk door een background worker laten afhandelen.
Het formulier blijft dan wel reageren tijdens de uitvoer van de code, neemt echter niet je bestaande 'fout' weg.

  • Damic
  • Registratie: september 2003
  • Nu online

Damic

Afwezig soms

Topicstarter
Op lijn 35 stopt ie als ie aan stap 1 bezig is als je sneller dan 1 minuut terug data wilt ophalen het verzenden van de gegevens is pas in stap 2 en daar komt ie al niet.

Ik kan vanalles en nog wat maar niets te goei, klinkt bekent?? Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


  • RobIII
  • Registratie: december 2001
  • Laatst online: 15:04

RobIII

Admin Devschuur®

^ Romeinse 3 ja!

Damic schreef op donderdag 23 april 2015 @ 17:57:
Ha ok 1 van de vorige keren kreeg ik het verwijt dat ik de code ergens anders moest posten omdat het te groot was :|
Te grote code is (hier op 't forum danwel (een link naar) elders) altijd ongewenst; we verwachten dat je enkel relevante code post. Dat is nooit meer dan, pakweg, 50 tot max. 100 regels (liefst nog minder, zeg <25). Als je het probleem niet in een (goede) hand vol regels code kunt isoleren moet je daar dus eerst mee aan de slag. Dat doe je niet alleen voor ons, maar ook voor jezelf; 9 v.d. 10 keer als je die moeite neemt kom je er gaandeweg namelijk zélf al achter wat 't probleem is. En kom je dat niet, dan heb je automatisch een goede testcase voor ons om 't probleem makkelijk te kunnen reproduceren / analyseren zonder dat je/wij door de bomen 't bos niet meer zien.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • Mostrow
  • Registratie: januari 2011
  • Laatst online: 11:25
Ik werk gewoon gesproken niet met VB maar op regel 28 zie ik een Application.DoEvents()

Kijk hier eens naar: MSDN: Application.DoEvents Method (System.Windows.Forms)

Lees het Caution gedeelte eens, misschien is het beter om dit stukje te laten lopen door een background worker?
Want nu heb ik een vermoeden dat hij blijft wachten hier?

  • Damic
  • Registratie: september 2003
  • Nu online

Damic

Afwezig soms

Topicstarter
Ja dat is waar maar dat is om de post data op te sturen en dat is pas na de 2de stap eerste stap is een GET.

Ik zou een manier moeten vinden om te controleren of er wel een verbinding tot stand is gekomen of dat er wel 1 vrij is.

Ik kan vanalles en nog wat maar niets te goei, klinkt bekent?? Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


  • Lethalis
  • Registratie: april 2002
  • Niet online
Application.DoEvents() is altijd fout.

Mijn insteek bij dit probleem is dat de hele code die de request doet, in een bepaalde Thread moet werken. Bijvoorbeeld door het gebruik van een BackgroundWorker.

De BackgroundWorker kun je zo configureren dat hij cancellation support. Duurt een request jou dan te lang? Dan kun je simpelweg de BackgroundWorker cancellen en dan wordt de thread die de request doet om zeep geholpen.

Ook heb je dan geen Application.DoEvents nodig :P Als je iets aan een Windows control wilt doorgeven, doe dit dan via een event (BackgroundWorker heeft een ReportProgress met user state object).

Sowieso is het een slecht idee om business code op te nemen in de presentatielaag. Maak op zijn minst een apart classje hiervoor. Dus dat de code in het Windows Form alleen een LoginController gebruikt bijvoorbeeld, die de webrequest enzovoorts doet.

[Voor 16% gewijzigd door Lethalis op 24-04-2015 12:12]

Even a broken clock is right twice a day.


  • Damic
  • Registratie: september 2003
  • Nu online

Damic

Afwezig soms

Topicstarter
Dus als ik het goed begrijp: al de code dat nu in de timer_tick sub word afgehalnd zou naar een background worker moeten en dan de timer laten door tikken en als ik een bepaal getal heb bereikt terwijl de BGW nog bezig is de BGW annuleren en eventueel terug opnieuw beginnen :)

edit: dat werkt dus (momenteel) blijkbaar, je mag alleen de timeout niet te strak zetten :D bedank allen

[Voor 15% gewijzigd door Damic op 25-04-2015 23:46]

Ik kan vanalles en nog wat maar niets te goei, klinkt bekent?? Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


  • Damic
  • Registratie: september 2003
  • Nu online

Damic

Afwezig soms

Topicstarter
En het probleem is terug, nu heb ik wel kunnen zien wat er niet gebeurde.
Als ik een httpwebrequest doen, dan moet ie normaal een verbinding openen naar de gevraagde webpagina, dit gebeurd niet meer en krijg ik dus timeouts.

Nu zou ik nog eens netstat moeten bekijken maar normaal blijft dat hetzelfde als wat NetSpeedMonitor weergeeft in connections.

Ik kan vanalles en nog wat maar niets te goei, klinkt bekent?? Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


  • robertpNL
  • Registratie: augustus 2003
  • Niet online
Als het probleem terug is, en je hebt geen code aanpassingen doorgevoerd, dan zou ik het buiten je code zoeken. Bv. eventuele virusscanner die je applicatie tegen houdt? Firewall issue? DNS issue? Kan je met de browser wel naar de website? Etc. etc.

  • RobIII
  • Registratie: december 2001
  • Laatst online: 15:04

RobIII

Admin Devschuur®

^ Romeinse 3 ja!

robertpNL schreef op woensdag 29 april 2015 @ 12:59:
Als het probleem terug is, en je hebt geen code aanpassingen doorgevoerd, dan zou ik het buiten je code zoeken. Bv. eventuele virusscanner die je applicatie tegen houdt? Firewall issue? DNS issue? Kan je met de browser wel naar de website? Etc. etc.
Dat, maar dat wil niet zeggen dat je applicatie dan maar moet freezen/crashen. Je zult je applicatie dus ook robuuster moeten maken / fixen.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • Damic
  • Registratie: september 2003
  • Nu online

Damic

Afwezig soms

Topicstarter
Jawel heb de code aangepast zodoende dat het in een aparte thread loopt (BGW) daarmee dat ik het zien wat er nu gebeurd. Applicatie blijft gewoon verder werken, behalve dan dat er geen data meer binnenkomt :( volgende dagen eens bekijken.

Ik kan vanalles en nog wat maar niets te goei, klinkt bekent?? Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


  • jelmervos
  • Registratie: oktober 2000
  • Niet online

jelmervos

Simple user

Werkt de eerste poging wel, en daarna krijg je timeouts?
Dan kan dit het zijn: MSDN: GetRequestStream Always Timeout Second Time

Oplossing: GetRequestStream en GetResponseStream ook dmv using aanroepen (zoals je nu al met GetResponse doet).

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Damic
  • Registratie: september 2003
  • Nu online

Damic

Afwezig soms

Topicstarter
Ik zou zeggen: "het staat in de logs" maar als ik de logs nazien van de voorbije dagen dan staat het et niet in :/

Eens proberen die tip :)

Ik kan vanalles en nog wat maar niets te goei, klinkt bekent?? Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


  • RobIII
  • Registratie: december 2001
  • Laatst online: 15:04

RobIII

Admin Devschuur®

^ Romeinse 3 ja!

Sowieso is 't 'best practice' om alles wat IDisposable implementeert altijd in een using statement te zetten (of desnoods de Dispose() method aan te roepen; en te zorgen dat dat ook écht gebeurt: denk aan een finally block bij een try...catch).

[Voor 23% gewijzigd door RobIII op 30-04-2015 18:21]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • jelmervos
  • Registratie: oktober 2000
  • Niet online

jelmervos

Simple user

RobIII schreef op donderdag 30 april 2015 @ 18:18:
[...]

Sowieso is 't 'best practice' om alles wat IDisposable implementeert altijd in een using statement te zetten (of desnoods de Dispose() method aan te roepen; en te zorgen dat dat ook écht gebeurt: denk aan een finally block bij een try...catch).
Klopt, al is het hier niet echt duidelijk aangezien je een functie aanroept. Creëer je zelf een object dmv new dan is het simpel. Je zou ook denken: de vervuiler moet opruimen. Dus de class die de constructor aanroept moet ook dispose doen.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0Henk 'm!

  • Damic
  • Registratie: september 2003
  • Nu online

Damic

Afwezig soms

Topicstarter
Ja dat kan wel maar als je zelf .flush .close en .dispose doet dan moet dat toch het zelfde resultaat geven?
Swat heb het aangepast en moet nog op de eerste fout wachten :(
Ondertussen ziet het erzo uit:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
            dim postReq As HttpWebRequest = DirectCast(WebRequest.Create(Uri), HttpWebRequest)
            With postReq
                .Timeout = 15000
                .ServicePoint.ConnectionLeaseTimeout = .Timeout + 5000
                .ServicePoint.MaxIdleTime = .Timeout
                .CookieContainer = tempCookies
                .Referer = URI_MT_USAGE
                .UserAgent = "Mozilla/5.0 (Windows; U; " & Environment.OSVersion.ToString & "; ru; rv:1.9.2.3)"
                .Accept = "text/plain, text/html"
                .ProtocolVersion = HttpVersion.Version11
                .ContentLength = byteData.Length
                .KeepAlive = False
                .AllowAutoRedirect = True
                .ContentType = "application/x-www-form-urlencoded"
                .Method = "GET"
                .Proxy = Nothing
                If bUseForm Then
                    .Method = "POST"
                    Using postreqstream As Stream = postReq.GetRequestStream()
                        postreqstream.Write(byteData, 0, byteData.Length)
                    End Using
                End If
            End With

            Using postresponse As HttpWebResponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
                If postresponse.StatusCode = HttpStatusCode.OK Then
                    If Not bCookieSet Then
                        tempCookies.Add(postresponse.Cookies)
                        bCookieSet = True
                    End If
                    Using postreqreader As New StreamReader(postresponse.GetResponseStream())
                        thePage = postreqreader.ReadToEnd
                    End Using
                Else
                    thePage = ""
                    Add2Log("HTTP_ERROR_CODE::" & postresponse.StatusCode & "::" & postresponse.StatusDescription)
                End If
            End Using

Ik kan vanalles en nog wat maar niets te goei, klinkt bekent?? Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0Henk 'm!

  • Woy
  • Registratie: april 2000
  • Niet online

Woy

Moderator Devschuur®
jelmervos schreef op donderdag 30 april 2015 @ 21:51:
[...]
Je zou ook denken: de vervuiler moet opruimen. Dus de class die de constructor aanroept moet ook dispose doen.
Nee de owner van het object moet opruimen, het probleem is dat er geen taalconstructie of vaste conventie is die aangeeft wie de owner is. Dat is ook iets wat vaak mis gaat bij het disposen van streams bijvoorbeeld ( De vraag is dan of de stream ook ownership neemt van zijn inner stream. Vaak kun je dat bij het creëren van een stream weer opgeven ).

De richtlijn bij Disposables is dat je ze of in een using statement gebruikt, of anders als class member en ze in je eigen Dispose opruimt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1


Apple iPhone SE (2020) Microsoft Xbox Series X LG CX Google Pixel 4a CES 2020 Samsung Galaxy S20 4G Sony PlayStation 5 Nintendo Switch Lite

'14 '15 '16 '17 2018

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2020 Hosting door True