我有一个符合以下要求的c#应用程序。
客户端计算机是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);
}
}
}