HttpWebRequest缓慢使用多个应用程序实例

时间:2013-02-04 19:36:41

标签: c# httpwebrequest

试图深入了解这一点!

我有一个非常基本的应用程序,使用httpwebrequests登录,导航到一个页面,然后抓取该页面的HTML。然后它会在循环中每隔5分钟将另一个webrequest预制成第三页。

它的工作正常并且是单线程的(并且相当陈旧),但是情况已经改变了,我现在需要紧密地运行这个应用程序的多个实例(我有一个.bat每隔2秒启动应用程序作为临时措施,直到我能够编写一个新的多线程解决方案)。

当应用程序的第一个实例开始一切正常时,第一个请求在~2秒内完成。第二个在大约3秒内。

然而,随着越来越多的这个应用程序的实例同时运行(> 100),一些奇怪的事情开始发生。

第一个Web请求仍然需要约2秒,但是第二个请求会延迟更多> 1分钟到达超时点。我似乎无法想到为什么会这样。第二页比第一页大,但没有什么不寻常的下载需要> 1分钟。

此服务器的互联网连接和硬件非常能够处理这些请求。

 CookieContainer myContainer = new CookieContainer();
        // first request is https
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(https://mysite.com/urlone);                                
        request.CookieContainer = myContainer;
        request.Proxy = proxy;
        Console.WriteLine(System.DateTime.Now.ToLongTimeString() + "  " + "Starting login request");
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream resStream = response.GetResponseStream();

        string tempString = null;
        int count = 0;

        do
        {
            // fill the buffer with data
            count = resStream.Read(buf, 0, buf.Length);

            // make sure we read some data
            if (count != 0)
            {
                // translate from bytes to ASCII text
                tempString = Encoding.ASCII.GetString(buf, 0, count);

                // continue building the string
                sb.Append(tempString);
            }
        }
        while (count > 0); // any more data to read?
        sb.Clear();
       response.Close();
       resStream.Close();
       string output6;



        Console.WriteLine(System.DateTime.Now.ToLongTimeString() + "  " + "login request comeplete");
        HttpWebRequest request6 = (HttpWebRequest)WebRequest.Create(@"http://mysite.com/page2");
        request6.CookieContainer = myContainer;
        response = (HttpWebResponse)request6.GetResponse();
        resStream = response.GetResponseStream();
        tempString = null;
        count = 0;

        do
        {
            count = resStream.Read(buf, 0, buf.Length);


            if (count != 0)
            {
                tempString = Encoding.ASCII.GetString(buf, 0, count);

                sb.Append(tempString);
            }
        }

        while (count > 0);
        output6 = sb.ToString();
        sb.Clear();
        response.Close();
        resStream.Close();

有什么想法吗?我不是非常先进的http网络请求,所以如果有人可以检查我没有做任何愚蠢的代码错误以上id欣赏它。我不知道我可能需要包括哪些其他信息,如果我错过了任何事情请告诉我,我会尽我所能提供。 提前谢谢。

编辑1:

我用fiddler找出问题的根源。看起来问题在于应用程序(或窗口)由于某种原因没有发送请求 - 物理请求实际上需要<根据小提琴手1秒钟。

2 个答案:

答案 0 :(得分:2)

查看一些内容

  1. ServicePointManager.DefaultConnectionLimit:如果您打算打开超过100个连接,请将此值设置为200-300
  2. 如果可能,请使用HttpWebRequest.KeepALive = true

答案 1 :(得分:0)

尝试将您的请求包装到using指令中,以确保它始终正确关闭。如果达到最大连接数,则必须等待先前的连接超时才能连接新连接。