Avatar billede loukas Mester
21. oktober 2003 - 10:23 Der er 10 kommentarer og
1 løsning

håndtere fejl med System.Net.WebClient

Jeg bruger denne function til at hente hjemmesider med.
Men hvad hvis webadressen ikke kan findes, eller der er en anden fejl?
Kan det ikke laves således at den retunerer en fejl i stedet for at programmet går i stå, og hvordan??



  Public Function GetPageHTTP(ByVal URL As String) As String
       
        Dim wc As New System.Net.WebClient()
        wc.Headers.Add("User-Agent", "vb.net_program")
        Dim s As System.IO.Stream = wc.OpenRead(URL)
        Dim r As String
        Dim sr As System.IO.StreamReader = New System.IO.StreamReader(s, System.Text.Encoding.UTF7, False)
        r = sr.ReadToEnd()
        Return r
    End Function
Avatar billede arne_v Ekspert
21. oktober 2003 - 14:51 #1
Den burde smide en WebException hvis den ikke kan hente fra URL.
Avatar billede arne_v Ekspert
21. oktober 2003 - 14:54 #2
Hvis du vil have mere styr over hvad der foregår så kan du bruge
(Http)WebRequest og (Http)WebResponse - der kan du læse HTTP
statud kod eog den slags.
Avatar billede odegaard Nybegynder
21. oktober 2003 - 22:37 #3
Måden at gøre det på, er at fange fejlen med try/catch.

Dim wc As New System.Net.WebClient()
Try
  wc.Headers.Add("User-Agent", "vb.net_program")
  Dim s As System.IO.Stream = wc.OpenRead(URL)
  Dim r As String
  Dim sr As System.IO.StreamReader = New System.IO.StreamReader(s, System.Text.Encoding.UTF7, False)
  r = sr.ReadToEnd()
  Return r
Catch ex As System.Exception
  Response.Write("Der skete en fejl: " & ex.Message)
  Return null
End Try
Avatar billede odegaard Nybegynder
21. oktober 2003 - 22:38 #4
Ups, det skal vist hedde "Return Nothing". Jeg har helt glemt det der VB sprog :-)
Avatar billede odegaard Nybegynder
21. oktober 2003 - 22:39 #5
...men er iøvrigt enig med arne_v at du i stedet bør bruge WebRequest/WebResponse. Det er meget nemmere.
Avatar billede loukas Mester
22. oktober 2003 - 23:22 #6
Tak for hjælpen,
jeg har fundet denne function og forsøgt mig lidt med WebRequest/WebResponse, men har problemer med headerne.


Fejl - This header must be modified with the appropriate property



Public Function GetHTMLPage(ByVal URL As String) As String
        Try
            Dim sResult As String
            Dim oHttp As HttpWebRequest
            Dim objResponse As WebResponse
            Dim objRequest As WebRequest = System.Net.HttpWebRequest.Create(URL)


            objRequest.Method = "GET"
            objRequest.Headers.Add("User-Agent", "vb.net_program")<-----HER----
            objRequest.Timeout = 120000 ' 20 sec.
            objResponse = objRequest.GetResponse

            Dim sr As System.IO.StreamReader = New System.IO.StreamReader(objResponse.GetResponseStream(), System.Text.Encoding.UTF7)

            sResult = sr.ReadToEnd()
            ' Close and clean up the StreamReader
            sr.Close()

            Return sResult
        Catch ex As System.Exception
            MessageBox.Show("Fejl - " & ex.Message)
            Return Nothing
        End Try
    End Function
Avatar billede odegaard Nybegynder
22. oktober 2003 - 23:36 #7
Ifølge WebRequest's WebHeaderCollection, så er User-Agent en "restricted header", hvad end det så betyder:
"Some common headers are considered restricted and are either exposed directly by the API (such as Content-Type) or protected by the system and cannot be changed."

Tjek lige om objRequest.Headers.IsRestricted("User-Agent") returnerer true. I så fald kan du ikke ændre den. Prøv at kigge i SDK'en http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemnetwebheadercollectionclassisrestrictedtopic.asp
Avatar billede arne_v Ekspert
22. oktober 2003 - 23:37 #8
Hm.

Docs siger:

Remarks
The WebHeaderCollection class is generally accessed through WebRequest.Headers or WebResponse.Headers. Some common headers are considered restricted and are either exposed directly by the API (such as Content-Type) or protected by the system and cannot be changed.

The restricted headers are:

Accept
Connection
Content-Length
Content-Type
Date
Expect
Host
If-Modified-Since
Range
Referer
Transfer-Encoding
User-Agent    <---------------------------

Det har de vist ikke lyst til at man sætter !
Avatar billede odegaard Nybegynder
22. oktober 2003 - 23:39 #9
hmm... selv samme link siger netop den er restricted.
Men det gøres således:
objRequest.UserAgent=".NET Framework Test Client";
Avatar billede odegaard Nybegynder
22. oktober 2003 - 23:41 #10
Arne_v: Men den siger også at "...and must be set using properties instead of directly or is set by the system. "

Skulle bare lige finde den property først, for jeg vidste at jeg engang selv havde sat den. :-)
Avatar billede arne_v Ekspert
22. oktober 2003 - 23:45 #11
Jep.

Jeg fandt den ikke fordi den var gemt under HttpWebRequest ikke WebRequest.

[det må også betyde at det må skulle være Dim objRequest As HttpWebRequest = ...]
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester