【问题标题】:Http request timeout issueHttp请求超时问题
【发布时间】:2009-10-20 15:54:56
【问题描述】:

我正在使用 VSTS 2008 + C# + .Net 3.5 开发控制台应用程序,并将请求发送到另一台服务器(Windows Server 2008 上的 IIS 7.0)。这是我的代码。我的问题是,就像在我的代码中一样,我使用 while 循环从服务器逐块读取块。超时请求。Timeout = Timeout * 1000 负责 (1) 与服务器打开连接的超时时间,或 (2) 每次读取操作的超时时间,或 (3) 用于 while 循环的总时间?

    static void PerformanceWorker()
    {
        Stream dataStream = null;
        HttpWebRequest request = null;
        HttpWebResponse response = null;
        StreamReader reader = null;
        try
        {
            request = (HttpWebRequest)WebRequest.Create(TargetURL);
            request.Timeout = Timeout * 1000;
            request.Proxy = null;
            response = (HttpWebResponse)request.GetResponse();
            dataStream = response.GetResponseStream();
            reader = new StreamReader(dataStream);

            // 1 M at one time
            char[] c = new char[1000 * 10];

            while (reader.Read(c, 0, c.Length) > 0)
            {
                globalCounter++;
            }
        }
        catch (Exception ex)
        {
            lock (counterLock)
            {
                globalFailCounter++;
                Console.WriteLine("Fail Counter: " + globalFailCounter + "\n" + ex.Message + "\n" + ex.StackTrace);
            }
        }
        finally
        {
            if (null != reader)
            {
                reader.Close();
            }
            if (null != dataStream)
            {
                dataStream.Close();
            }
            if (null != response)
            {
                response.Close();
            }
        }
    }

【问题讨论】:

  • 谢谢,以后我会处理的。 :-)

标签: c# .net visual-studio-2008 iis-7 httpwebrequest


【解决方案1】:
  1. 与服务器的打开连接超时

【讨论】:

  • 那么如何设置每个读操作的超时时间和整个读操作的while循环呢?
  • “ReadWriteTimeout”属性处理 #2。您必须自己跟踪#3。
  • 您的意思是 ReadWriteTimeout 适用于我循环中的每个单独的读/写操作?
  • 我有一个相关的问题,如果你能看一下,不胜感激。 stackoverflow.com/questions/1598748/…
【解决方案2】:

来自MSDN

超时是毫秒数 一个后续的同步请求 使用 GetResponse 方法等待 得到回应,并且 GetRequestStream 方法等待一个 溪流。如果资源不 在超时期限内返回, 请求引发 WebException 状态属性设置为 WebExceptionStatus.Timeout。

我怀疑您是否可以轻松地为读取操作设置超时,而无需任何低级技巧。您使用响应对象读取的所有数据都来自以可用网络带宽的速率填充的网卡缓冲区。当缓冲区为空且没有来自发送方端点的新数据时执行读取时,您可能会在某个时间点超时。

附:这更像是对@Gary 答案的评论,也许有人可以把它移到那里。

【讨论】:

  • 你的意思是 HttpWebRequest.Timeout 只用于打开连接?
  • 我有一个相关的问题,如果你能看一下,不胜感激。 stackoverflow.com/questions/1598748/…
  • Well Timeout 用于打开连接和所有后续同步请求。所以调用 GetResponse() 会超时。我怀疑在 GetResponse() 完成后,您已经在网络(卡)缓冲区中拥有所有必需的数据。当您执行 Read() 操作时,您实际上不是从网络中检索位,而是缓冲区本身,因此此阶段的超时并不重要。请注意,我不是 100% 确定这个 sis 这么简单,如果您的响应数据大小大于网络缓冲区,可能在某个阶段您读取的调用会阻塞,直到缓冲区再次充满数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2013-09-05
  • 2011-11-05
  • 2010-12-12
  • 2014-04-25
  • 1970-01-01
相关资源
最近更新 更多