2010-12-14 17 views
0

Je travaille sur un formulaire dans lequel les utilisateurs sont invités à fournir l'URL d'un fichier. Je dois vérifier si cette URL pointe vraiment vers quelque chose. J'utilise un CustomValidator avec une validation côté serveur. Voici le code:Vérification de la validité de l'URL dans VB.net

Protected Sub documentUrlValide_ServerValidate 
(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) 
Handles documentUrlValide.ServerValidate 

    Try 
     Dim uri As New Uri(args.Value) 
     Dim request As HttpWebRequest = HttpWebRequest.Create(uri) 
     Dim response As HttpWebResponse = request.GetResponse() 
     Dim stream As Stream = response.GetResponseStream() 
     Dim reader As String = New StreamReader(stream).ReadToEnd() 
     args.IsValid = True 
    Catch ex As Exception 
     args.IsValid = False 
    End Try 

End Sub 

Je l'ai testé avec plusieurs URL valides, aucun passé le test, le request.GetResponse() renvoie toujours WebException: « ne peut pas résoudre le nom distant ».

Quel est le problème avec ce code?

Mise à jour:

Je ne pouvais pas faire de ce côté serveur de travail, en dépit de mon code étant apparemment bien, donc je l'ai couru côté client avec une requête HTTP synchrone javascript. Voici le code (notez que ma demande n'est demandé d'exécuter sur IE, ce code ne fonctionnera pas sur d'autres navigateurs Dut à Http demander un service est différent)

function testURLValide(sender, args) 
{ 
    var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
    xmlhttp.open("HEAD", args.Value, false); 
    xmlhttp.send(null); 

    if (! (xmlhttp.status == 400 || xmlhttp.status == 404)) 
    { 
     args.IsValid = true; 
    } 
    else 
    { 
     args.IsValid = false; 
    } 
} 

Répondre

0

J'ai mis votre code dans LINQPad et l'ai testé et ça a bien fonctionné ... La seule différence est args.Value.

Dim uri As New Uri("http://www.google.com") 
Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create(uri) 
Dim response As System.Net.HttpWebResponse = request.GetResponse() 
Dim stream As Stream = response.GetResponseStream() 
Dim reader As String = New StreamReader(stream).ReadToEnd() 

reader.Dump() 

< DOCTYPE html > <html> < tête > < meta http-equiv = "content-type" content = "text/html; charset = ISO-8859-1" > <titre> Google </titre > ............

+0

J'ai mis ce code exact dans mon application et cela ne fonctionne pas. Je me demande si cela pourrait être lié à une règle de pare-feu dans mon bureau. Je vais jeter un coup d'oeil à ça. –

0

Pourquoi ne pas utiliser WebClient.DownloadString() méthode à la place?

+0

Testé, et il ne change rien. Mais philip a prouvé que mon code est censé fonctionner de toute façon. –

0

Au lieu de lire le flux, pourquoi ne pas tester le code d'état HTTP? Je crois que c'est response.StatusCode. La valeur que vous rechercheriez serait 200, ou peut-être quelque chose dans les 300 (redirection).

+0

C'est ce que je prévois faire pour améliorer mon mécanisme de validation. Malheureusement, je ne suis pas si loin en ce moment, mon code lance une exception avant de retourner un code d'état. –