.Net WebRequest在第一次失败后一直失败

时间:2010-02-01 11:24:04

标签: c# .net web-applications

好的,这是一个随机错误。我正在动态地将图像添加到html页面。图像位于我无法控制的另一台服务器上。图像的名称如下: imageName10.jpg imageName11.jpg imageName13.jpg imageName14.jpg imageName16.jpg imageName17.jpg imageName19.jpg

让我们看一下上面的图片列表。我想获得所有图像,但我不知道有多少图像。我知道它以字符串“imageName”开头,数字在10到20之间,然后以字符串“.jpg”结束。我决定创建一个从10到20的循环,创建图像名称并将图像标记添加到我的html。这有效,但我不想添加损坏的链接,所以我想先检查图像是否存在。为此,我使用WebRequest获取图像URL,超时为5秒。如果它超时,它基本上会跳过链接并继续循环。

        String dynamicHtmlStr = String.Empty;
        dynamicHtmlStr += "<TABLE>";
        WebRequest webReq = null;
        WebResponse webResp = null;
        for (int i = 10; i < 20; i++)
        {
            try
            {
                webReq = WebRequest.Create("http://www.someurl.com/image/imageName" + i + ".jpg");
                webReq.Timeout = 5000;
                webResp = webReq.GetResponse();

                dynamicHtmlStr += "<TR>";
                dynamicHtmlStr += "<TD>";
                dynamicHtmlStr += "<IMG http://www.someurl.com/image/imageName" + i + ".jpg"\">";
                dynamicHtmlStr += "</TD>";
                dynamicHtmlStr += "</TR>";
            }
            catch (Exception)
            {
            }
        }
        dynamicHtmlStr += "</TABLE>";
        return dynamicHtmlStr;

我的问题是: webrequest第一次失败后。之后的所有其他Web请求似乎也失败了。例如,拍摄上面的图像列表。循环从10开始。它执行Web请求以查看“imageName10.jpg”是否存在,获得良好响应,我将html字符串添加到dynamicHtmlStr变量。它再次循环,这次是在11,并且eveything仍然很好。然后我们继续到12. 12是假的并且没有添加到dynamicHtmlStr,因为它不存在,这是正确的。我们转移到13确实存在,但是这也失败了,之后的所有其他网络请求,无论它是否存在。

这对我没有意义。我做错了吗?

2 个答案:

答案 0 :(得分:2)

我必须说,情况有点奇怪。

我倾向于使用HttpWebRequest / HttpWebResponse类,并直接使用这些类。

请求非常简单,请查看herehere

创建请求后,您可以在此处查看响应:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    using (Stream responseStream = response.GetResponseStream())
    {
        using (StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8))
        {
           // Put in code to check response status. You'll probably get a 404 when not found.
        }
    }
}

另一个注意事项:我知道循环大小很小,但您应该总是尝试使用StringBuilder进行迭代字符串连接。

答案 1 :(得分:1)

我遇到了同样的问题。

根据此链接的示例:http://msdn.microsoft.com/en-us/library/system.net.webrequest.begingetresponse.aspx

发出一个response.GetResponseStream()。Close();在响应之前.Close();或者在使用段结束之前,可能会解决问题。