我正在处理一个表单,要求用户提供文件的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;
}
}
答案 0 :(得分:0)
如果你可以使用javascript,这是一个非常好的方法:How to Test a URL in jQuery
编辑:那么其中一种方法呢?
搜索"是否存在网址?"在this page。
答案 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(重定向)中的值。