9

我们有一个工具可以检查给定的 URL 是否是实时 URL。如果给定的 url 是活动的,我们软件的另一部分可以筛选出其中的内容。

这是我检查网址是否有效的代码

    public static bool IsLiveUrl(string url)
    {
        HttpWebRequest webRequest = WebRequest.Create(url) as HttpWebRequest;
        webRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5";
        webRequest.CookieContainer = new CookieContainer();
        WebResponse webResponse;
        try
        {
            webResponse = webRequest.GetResponse();
        }
        catch (WebException e)
        {
            return false;
        }
        catch (Exception ex)
        {

            return false;
        }
        return true;
    }

此代码运行良好,但对于托管在 apache 上的特定站点,我收到带有以下消息的 Web 异常。“远程服务器返回错误:(403) Forbidden”在进一步检查中,我在 WebException 对象中发现了以下详细信息

Status="ProtocolError" StatusDescription="Bad Behaviour"

这是请求标头“用户代理:Mozilla/5.0 (Windows;U;Windows NT 5.1;en-US;rv:1.8.0.6) Gecko/20060728 Firefox/1.5 主机:scenespares.co.uk 连接:保持活动"

这是响应标头“Keep-Alive: timeout=4, max=512 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html Date: Thu, 13 Jan 2011 10:29:36 GMT Server: Apache "

我在 vs2008 中使用手表提取了这些标头。使用的框架是 3.5。

4

3 回答 3

13

原来我需要做的就是跟随

            webRequest.Accept = "*/*";
            webResponse = webRequest.GetResponse();

它是固定的。

于 2011-01-13T10:55:05.570 回答
0

我相信有很多类似的问题取决于服务器应用程序。在我的特殊情况下,请参阅:远程服务器返回错误:(403)禁止

于 2015-01-11T00:37:18.123 回答
0

在面对这个问题一整天后,我为我的网络抓取应用程序修复了它,希望它可以帮助其他

    public static string GetPageContent(string url)
    {
        CookieContainer cookieContainer = new CookieContainer();
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.CookieContainer = cookieContainer; // after Create() method
        request.AllowAutoRedirect = true; //  should be true
        request.UserAgent= ".NET Framework Test Client"; // should not be null

        var responseStr = string.Empty;
        using (var response = request.GetResponse())
        {
            Stream dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            responseStr = reader.ReadToEnd();
            reader.Close();
            dataStream.Close();
        }
        return responseStr;
    }
于 2021-06-28T04:33:29.567 回答