如何在C#中验证URL以避免404错误?

如何在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

我需要写一个工具,将报告在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-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”属性,并根据需要进行设置。