HttpWebRequest超时,但没有数据包离开客户端

时间:2015-06-10 04:39:59

标签: c# timeout httpwebrequest wireshark

我有一个符合以下要求的c#应用程序。

  1. 定期(700ms)使用GET将数据发送到cgi。
  2. 服务器将仅响应作为确认发送的GET字符串。
  3. 发送的值不断变化,不会存储,排序或重试。
  4. 一次只与服务器建立一个连接。
  5. 发现之前连接仍在进行中的计时器事件应该只是静静地退出并让下一个事件继续进行。
  6. 客户端计算机是Windows Server 2012.HTTP服务器是黑匣子设备(据信是运行Linux)。环境是低延迟生产,安全性极其严格(网络/政策/等)。

    问题: 客户端将定期开始抛出异常

      

    “操作超时”

    滴水停止。同时,Wireshark显示

      

    没有从客户端到服务器的连接。

    然而,VisualStudio显示

      

    客户端每隔700毫秒尝试连接并超时。

    当它没有抛出上述异常时,似乎工作正常。 HTTP服务器似乎在任何时候都拒绝连接。有时客户端会恢复,大多数时候它会继续抛出异常,直到重新启动。 AppDomain线程池是稳定的。内存消耗很好。

    为了混淆问题,我在实验室中拥有相同的硬件/软件/网络而没有安全性,一次运行几天完美无瑕。我的代码被指责为“故障”。

    我最近发现HttpWebRequest.Timeout属性限制了事务的整个生命周期,而不仅仅是响应等待。我正在增加它,目前正在测试中。

    任何人都会在下面的代码中看到引起此问题的任何明显的(或其他)?

    // timer call back at 700ms interval
    void m_postTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        try
        {
            if (Interlocked.Read(ref this.m_isLocked) == 0)
            {
                if (Monitor.TryEnter(this.m_lock, 10))
                {
                     Interlocked.Exchange(ref this.m_isLocked, 1);
    
                    try
                    {
                        // value1 & value2 set elsewhere
                        string url = String.Format("http://1.1.1.1/set.cgi?value1={0}&value2={1}", value1, value2);
    
                        this.m_post = (HttpWebRequest)WebRequest.Create(url);
    
                        this.m_post.Timeout = 500;
    
                        this.m_post.Credentials = new NetworkCredential(this.user, this.pass);
    
                        WebResponse response = this.m_post.GetResponse();
    
                        response.Close();
    
                        Monitor.Exit(this.m_lock);
    
                        Interlocked.Exchange(ref this.m_isLocked, 0);
                    }
                    catch (WebException ex)
                    {
                        // handle web exceptions
    
                        // if we've locked earlier and hit an exception, 
                        // the unlock has been skipped. unlock
                        if (Interlocked.Read(ref this.m_isLocked) > 0)
                        {
                            Monitor.Exit(this.m_lock);
    
                            Interlocked.Exchange(ref this.m_isLocked, 0);
                        }
                    }
                }
            }
            else
            {
                // indicate that a pre-existing connection is still in progress
            }
        }
        catch (Exception ex)
        {
            // handle generic exception
    
            // if we've locked earlier and hit an exception, 
            // the unlock has been skipped. unlock
            if (Interlocked.Read(ref this.m_isLocked) > 0)
            {
                Monitor.Exit(this.m_lock);
    
                Interlocked.Exchange(ref this.m_isLocked, 0);
            }
        }
    }
    

0 个答案:

没有答案