Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpWebRequest因应用程序的多个实例而变慢_C#_Httpwebrequest - Fatal编程技术网

C# HttpWebRequest因应用程序的多个实例而变慢

C# HttpWebRequest因应用程序的多个实例而变慢,c#,httpwebrequest,C#,Httpwebrequest,试图弄清这件事的真相 我有一个非常基本的应用程序,它使用httpwebrequests登录,导航到一个页面,然后获取该页面的html。然后,它在循环中每隔5分钟向第三个页面执行另一个webrequest 它的所有工作都很好,是单线程的(而且相当旧),但是情况已经发生了变化,我现在需要紧密地一起运行这个应用程序的多个实例(我有一个.bat作为临时措施,每2秒启动一次应用程序,直到我能够编写一个新的多线程解决方案为止) 当应用程序启动的第一个实例一切正常时,第一个请求在~2秒内完成。大约3秒钟后第二

试图弄清这件事的真相

我有一个非常基本的应用程序,它使用httpwebrequests登录,导航到一个页面,然后获取该页面的html。然后,它在循环中每隔5分钟向第三个页面执行另一个webrequest

它的所有工作都很好,是单线程的(而且相当旧),但是情况已经发生了变化,我现在需要紧密地一起运行这个应用程序的多个实例(我有一个.bat作为临时措施,每2秒启动一次应用程序,直到我能够编写一个新的多线程解决方案为止)

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

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

第一个web请求仍然需要约2秒,但是第二个请求延迟超过1分钟,直到超时。我似乎想不出这是为什么。第二个页面比第一个页面大,但下载时间不会超过1分钟

此服务器的internet连接和硬件完全能够处理这些请求

 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网络请求,所以如果有人可以检查我没有犯任何愚蠢的代码错误以上我感谢它。我不知道我还需要在这里提供什么信息,如果我遗漏了什么,请告诉我,我会尽力提供。 提前谢谢

编辑1:


我用小提琴手找出了问题的根源。问题似乎在于应用程序(或windows)出于某种原因没有发送请求-根据fiddler的说法,实际请求实际上需要<1秒钟。

查看一些内容

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

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

    您是否了解了WireShark在网络级别上的情况?找出什么是限制因素。另外,请使用
    using
    语句,而不是显式调用
    Close
    。大多数web服务器限制来自一台机器的连接数。您可能会遇到此限制。使用fiddler查看发生计时问题的位置。很抱歉,我忘记添加我已经尝试了defaultconnectionlimit,keepalive=true没有任何区别。