如何在C#中验证URL以避免404错误?
我需要写一个工具,将报告在C#坏网址的。只有当用户在浏览器中看到404错误时,URL才会报告已损坏。我相信可能会有一些技巧来处理进行URL重写的web服务器。这是我的。正如您所看到的,只有一些URL验证不正确如何在C#中验证URL以避免404错误?,c#,C#,我需要写一个工具,将报告在C#坏网址的。只有当用户在浏览器中看到404错误时,URL才会报告已损坏。我相信可能会有一些技巧来处理进行URL重写的web服务器。这是我的。正如您所看到的,只有一些URL验证不正确 string url = ""; // TEST CASES //url = "http://newsroom.lds.org/ldsnewsroom/eng/news-releases-stories/local-churches-teach-how-to-plan-for-disas
string url = "";
// TEST CASES
//url = "http://newsroom.lds.org/ldsnewsroom/eng/news-releases-stories/local-churches-teach-how-to-plan-for-disasters"; //Prints "BROKEN", although this is getting re-written to good url below.
//url = "http://beta-newsroom.lds.org/article/local-churches-teach-how-to-plan-for-disasters"; // Prints "GOOD"
//url = "http://"; //Prints "BROKEN"
//url = "google.com"; //Prints "BROKEN" althought this should be good.
//url = "www.google.com"; //Prints "BROKEN" althought this should be good.
//url = "http://www.google.com"; //Prints "GOOD"
try
{
if (url != "")
{
WebRequest Irequest = WebRequest.Create(url);
WebResponse Iresponse = Irequest.GetResponse();
if (Iresponse != null)
{
_txbl.Text = "GOOD";
}
}
}
catch (Exception ex)
{
_txbl.Text = "BROKEN";
}
问题是,我相信大多数“应该是好的”案例实际上都是在浏览器级别处理的。如果省略“http://”,则请求无效,但浏览器会为您输入该请求 因此,也许你可以做一个类似于浏览器的检查:
- 确保开头有一个“http://”
- 确保开头有一个“www.”
http://
或https://
发送到URL,并将其传递给WebClient.OpenRead
方法。如果URL格式不正确,它将抛出WebException
private WebClient webClient = new WebClient();
try {
Stream strm = webClient.OpenRead(URL);
}
catch (WebException we) {
throw we;
}
首先,
Irequest
和Iresponse
不应该这样命名。它们应该是webRequest
和webResponse
,甚至是request
和response
。大写字母“I”前缀通常仅用于接口命名,而不用于实例变量
要进行URL有效性检查,请使用UriBuilder
获取Uri
。然后您应该使用HttpWebRequest
和HttpWebResponse
,以便检查强类型状态代码响应。最后,您应该提供更多关于损坏内容的信息
以下是我介绍的一些其他.NET内容的链接:
try
{
if (!string.IsNullOrEmpty(url))
{
UriBuilder uriBuilder = new UriBuilder(url);
HttpWebRequest request = HttpWebRequest.Create(uriBuilder.Uri);
HttpWebResponse response = request.GetResponse();
if (response.StatusCode == HttpStatusCode.NotFound)
{
_txbl.Text = "Broken - 404 Not Found";
}
if (response.StatusCode == HttpStatusCode.OK)
{
_txbl.Text = "URL appears to be good.";
}
else //There are a lot of other status codes you could check for...
{
_txbl.Text = string.Format("URL might be ok. Status: {0}.",
response.StatusCode.ToString());
}
}
}
catch (Exception ex)
{
_txbl.Text = string.Format("Broken- Other error: {0}", ex.Message);
}
重写不需要技巧。重写是一种覆盖另一种服务器端技术的服务器端技术。在服务器的黑盒子之外,没有重写之类的事情。应该注意的是,大多数网站现在每天返回404页,状态代码为200-OK。虽然这显然是错误的,但这是事实,在编写应用程序时应该加以考虑。@Jared。真的吗?默认情况下,apache和iis以及大多数其他Web服务器将执行正确的操作并返回404。过去,当人们定制404页的buggily时,我经常会看到这种情况,但现在似乎要难得多了。仍然有很多有缺陷的站点重定向到404,而不是仅仅提供404(“是的,我在这里找到了,成功…哦,没有找到”,当它应该说“不,没有找到”),但这更容易被发现。@Jon Hanna,我想你说得很好。开发人员在使用正确的状态代码方面已经做得更好了,而且问题可能会随着时间的推移而减少,但是仍然存在一个有趣的问题,即当您不能信任状态代码时,自动确定是否无法找到资源。不是真的。在浏览器之外使用URL有很多原因(例如,像这个问题),浏览器是唯一允许您省略协议前缀的软件。此外,子域(如果有)不需要以“www.”开头才有效。我知道,但我是基于他对“应该是好的”含义的假设,因为显然它们与请求/响应对象不同。从外观上看,省略www.将返回'good',只要它有'http://',这很有意义,因为您需要告诉请求对象您计划使用哪个协议。这段代码很好,但是我将使用UriBuilder()来创建Uri。这将删除方案(即“http://”)周围的字符串操作,因为它将接受带或不带&然后您可以检查“scheme”属性,并根据需要进行设置。