0

试图追根溯源!

我有一个非常基本的应用程序,它使用 httpwebrequests 登录、导航到一个页面,然后获取该页面的 html。然后,它每 5 分钟循环执行一次对第三页的 Web 请求。

它一切正常并且是单线程的(并且相当旧),但是情况已经改变,我现在需要紧密地一起运行这个应用程序的多个实例(我有一个 .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 web 请求不是很先进,所以如果有人可以检查我没有在上面犯任何愚蠢的代码错误,我将不胜感激。我不知道我可能需要在这里包含哪些其他信息,如果我遗漏了什么,请告诉我,我会尽力提供。提前致谢。

编辑1:

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

4

2 回答 2

2

检查几件事

  1. ServicePointManager.DefaultConnectionLimit:如果您打算打开超过 100 个连接,请将此值设置为200-300.
  2. 如果可能的话使用HttpWebRequest.KeepALive = true
于 2013-02-04T19:41:22.743 回答
0

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

于 2013-08-12T08:41:30.533 回答