webForumDet fria alternativet

Hur bäst skriva funktion som kollar om en site ger response

.NET

8 svar · 317 visningar · startad av erka

Medlem sedan dec. 19996 522 inlägg
Frågan#1

Hej!
Pillar med en funktion som ska validera ifall en url man skickar in existerar, alltså att servern är uppe.

Har lite problem att hajja hur man bäst ska skriva den, vill ju enbart ha den så att om den finns returnerar den true annars false.

Private Function ValidateURLresponse(ByVal URL As String) 
  Dim objWebRequest as System.Net.HttpWebRequest 
  Dim objWebResponse as System.Net.HttpWebResponse 
  Dim StreamRdr as System.IO.StreamReader 
  Dim SiteRespond As Boolean = False
  Try 
    objWebRequest = objWebRequest.Create(URL) 
    objWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)"
    objWebResponse = objWebRequest.GetResponse() 
    StreamRdr = New System.IO.StreamReader(objWebResponse.GetResponseStream()) 
    StreamRdr.Close() 
    objWebResponse.Close() 
    SiteRespond = True
    Return SiteRespond
  Catch Exp As Exception
    SiteRespond = False
  End Try 
End Function

som ni ser har jag lagt SiteRespond = False i mitt catch block, är det ett bra ställe att lägga den på, om siten inte returnerar något svar ska det ju bli false. Om inte hur ska jag skriva min funktioner för att det ska vara "rätt". Jag är inte i detta fall intresserad över varför inte siten svarar, men det vore bra om någon kunde tala om för mig vart jag ska lägga anrop som skickar ett mail/sms om något fel returnerats, är det i mitt catch block ?

tacksam

Medlem sedan juni 20022 599 inlägg
#2

Lite löst svammel:

1. Borde du inte ha en returtyp på din funktion? As Boolen tex?

2.

objWebRequest = objWebRequest.Create(URL)

borde vara

objWebRequest = System.Net.HttpWebRequest.Create(URL)

eftersom Create är en statisk metod.
3.

erka skrev:

som ska validera ifall en url man skickar in existerar,

Om man ska vara petig så gör du väl inte det? Du använder ju aldrig StreamReadern så det kan ju vara en 404-sida som returneras utan att du märker det. Du kollar egentligen bara om servern svarar.

4.

  Catch Exp As Exception
    SiteRespond = False
  End Try

Att fånga alla fel i en metod är ganska farligt i en skarp applikation. Om du har extrem otur och får ett djupare IO- eller vi-har-slut-på-minne-fel så kommer din applikation aldrig att märka det och tuffa på som tidigare. Din funktion ska bara fånga de fel den klarar av att hantera. Tex:

Private Function ValidateURLresponse(ByVal URL As String) as boolean
  ' Din hämtningskod
    Return true
  Catch Exp As WebException
   'Kolla vad som hänt.
    Return false
  End Try 
End Function

Andra fel ska släppas vidare så att koden som anropar funktionen får möjlighet att hantera dem (om den vill).

5.

men det vore bra om någon kunde tala om för mig vart jag ska lägga anrop som skickar ett mail/sms om något fel returnerats, är det i mitt catch block ?

Om du nu valt att göra en funktion och inte en sub så är det kanske mer logiskt att överlåta det till den anropande koden. Vad ska du annars använda ditt returvärde till?

Typ:

if dittobjekt.ValidateURLresponse(URL) then
	'Gör något.
else
	'Gör något annat (skicka mail tex).
end if
Medlem sedan dec. 19996 522 inlägg
#3

Tack Niko,

2. Exakt vad är en statisk medod ?
3. Hur kan man kolla om siten släpper in mig, att sidan finns, undvika 404 och andra liknande sidor med andra ord

tack

Medlem sedan juni 20022 599 inlägg
#4

En statisk metod är en metod som anropas direkt på klassen utan att man behöver skapa en instans. Det heter förresten Shared i VB.NET, när jag tänker efter.

Hur kan man kolla om siten släpper in mig, att sidan finns, undvika 404 och andra liknande sidor med andra ord

Jag hade nog väldigt fel på den punkten nu när jag kollar. GetResponse kastar faktiskt ett WebException om sidan inte finns, så det räcker med att fånga det felet och returnera "false".

/red: Du borde också kunna skippa din StreamReader eftersom du inte bryr dig om vad det står på sidan. Bara om den finns, eller inte.

Medlem sedan dec. 19996 522 inlägg
#5

Tack för hjälpen niko, en sak till. Om jag skriver som du ett catch block liknande

Catch Exp As WebException
   'Kolla vad som hänt.
    Return false
  End Try

Så undrar jag hur man på bästa sätt (eller om det finns flera) kan kolla upp det, använder jag Throw Exp i Catch blocket genererar ju aspx sidorna ett fel om i detta fall servern inte kan hittas. Man vill ju gärna lösa det så att det kommer upp ett meddelande eller att funktionen returnerar (som i detta fall) false och därefter i ovanliggande lager eller funktion som använder sig av den funktionen som returnerat felhet behandlar informationen och gör något.

Lite luddigt men kom inte på ett bättre sätt att förklara det på. Hur hanterar man fel och hur använder man det rent praktiskt i en asp.net applikation

Medlem sedan juni 20022 599 inlägg
#6

Hmm .. Nu känns det som vi är lite utanför min division. Jag menade nog att du skulle ha en enkel funktion som returnerade true/false baserat på om det gick att komma åt sidan, eller inte, och inte rapporterade tillbaka exakt vad felet beror på. Alltså ungefär:

Private Function ValidateURLresponse(ByVal URL As String) As Boolean
        Dim objWebRequest As System.Net.HttpWebRequest
        Dim objWebResponse As System.Net.HttpWebResponse
        Dim SiteRespond As Boolean = False
        Try
            objWebRequest = System.Net.HttpWebRequest.Create(URL)
            objWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)"
            objWebResponse = objWebRequest.GetResponse()
            objWebResponse.Close()
            Return True
        Catch Exp As System.Net.WebException
            'Sidan gick inte att komma åt. Och vi bryr oss egentligen inte om varför.
            Return False
        Catch Exp As System.UriFormatException
            'Fel format på URL:en.
            Return False
        Catch Exp As System.NotSupportedException
            'Okänt protokoll.
            Return False
	catch Exp as Exception
	    'Släpp igenom övriga fel.
	     throw
        End Try
End Function

Om du istället vill låta den anropande koden se det exakta felet, vad det än, är så finns det väl lite olika möjligheter:

1. Returnera en intern statuskod istället för boolean. (0=OK, 1=Okänt protokoll osv ..
2. Släng vidare alla fel.
3. Paketera om felen i nån egen exceptionklass och släng dem vidare.

Exakt vad som skulle vara bäst i ett sånt här fall vet jag faktiskt inte, tyvärr.

Medlem sedan dec. 19996 522 inlägg
#7

Tack Niko :) Vart hittar man alla olika Exception typer i ramverket ?

Medlem sedan juni 20022 599 inlägg
#8

Vet faktiskt inte om det finns nån bra sammanställning nånstans. Vad man kan göra är att titta på de funktioner man anropar och kolla vilka exceptions de kan kasta. I detta fall Create och GetResponse. Kollar man sen lite på tex WebException-klassen så ser man att just den har en Status-property som mer noggrannt talar om vad som gick fel. (Vilket var det du frågade om innan.)

Medlem sedan dec. 19996 522 inlägg
#9

Tackar!

257 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)