检查VB.net中的URL有效性

时间:2010-12-14 15:41:42

标签: javascript asp.net vb.net

我正在处理一个表单,要求用户提供文件的URL。我需要检查该URL是否真的指向某个东西。我使用CustomValidator与服务器端验证。这是代码:

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

我用几个有效的URL测试了它,没有通过测试,request.GetResponse()总是抛出一个WebException:“无法解析远程名称”。

此代码有什么问题?

更新:

尽管我的代码看起来很好,但我无法让这个工作服务器端,所以我在客户端使用javascript同步HTTP请求运行它。这是代码(注意我的应用程序只被要求在IE上运行,这个代码不能在其他浏览器上运行,但是Http请求调用是不同的)

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;
    }
}

4 个答案:

答案 0 :(得分:0)

如果你可以使用javascript,这是一个非常好的方法:How to Test a URL in jQuery

编辑:那么其中一种方法呢?

搜索"是否存在网址?"在this page

How to check if a URL exists in javascript

Javascript to check if URL exist

答案 1 :(得分:0)

为什么不使用WebClient.DownloadString()方法?

答案 2 :(得分:0)

我将你的代码放入LINQPad并进行了测试,它运行得很好...... 唯一的区别是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>< head>< meta   HTTP的当量=“内容类型”   含量=“text / html的;   字符集= ISO-8859-1" ><标题>谷歌< /标题> ............

答案 3 :(得分:0)

如何测试HTTP状态代码,而不是读取流?我相信它是response.StatusCode。您要查找的值为200,或者可能是300s(重定向)中的值。