检查网页的响应状态并获得间歇性的超时回复

时间:2015-02-05 18:46:55

标签: c# networking httpwebrequest httpwebresponse

我正在创建一个Windows服务,用于检查我拥有的各种服务的状态。问题是10次中有9次,响应“超时”。有几次google.ca超时了。

这是我的代码

try
{
    var myRequest = (HttpWebRequest)WebRequest.Create(url);
    NetworkCredential networkCredential = new NetworkCredential("UserName", "password", "domain");
    // Associate the 'NetworkCredential' object with the 'WebRequest' object.
    myRequest.Credentials = networkCredential;
    myRequest.Timeout = Timeout.Infinite;
    myRequest.KeepAlive = true;
    var response = (HttpWebResponse)myRequest.GetResponse();
    if (response.StatusCode == HttpStatusCode.OK)
    {
        bool isJson = Regex.IsMatch(url, "JSON", RegexOptions.IgnoreCase);
        if (isJson)
        {
            StreamReader sr = new StreamReader(response.GetResponseStream());
            if (sr.ReadToEnd().Contains("error"))
            {
                errorMessages = (string.Format("{0} unavailable: {1}", url, "The document contains the word error"));
                return false;
            }

        }

        return true;

    }
    else
    {
        errorMessages = (string.Format("{0} Returned, but with status: {1}", url, response.StatusDescription));
        return false;
    }
}
catch (Exception ex)
{
    //  not available at all, for some reason
    errorMessages = (string.Format("{0} unavailable: {1}", url, ex.Message));
    return false;
}

我认为问题是

如果我在Chrome中停用缓存,当我访问某些页面时,有些时候,Chrome会认为页面仍在加载,即使图片或页面已完全加载。

无论如何我可以调整我的代码以适应这个吗?

编辑:已添加

myRequest.Timeout = Timeout.Infinite;
myRequest.KeepAlive = true;

现在它只是无限期地挂起。

编辑:

有没有办法查看页面是否部分加载?我可以删除无限超时,并将其作为流读取器对象读取,以查看它是否至少部分加载。

1 个答案:

答案 0 :(得分:1)

同时添加UserAgent字符串,因为某些Web服务器将阻止来自同一IP地址的重复请求。

您可能还想在Cookie容器中添加并在请求之间保留它。

但是,要礼貌 - 不要忘记你正在添加Web服务器负载。如果它是你自己的网站那么好 - 但如果它是别人的 - 你应该使用一个识别你的UserAgent,遵循他们的robot.txt文件指令并在请求之间使用合适的时间。