2011-05-05 45 views
3

我正在发送一个HTTPWebRequest到下面的代码的第三方。响应需要2到22秒才能回来。第三方声称,一旦他们收到它,他们立即发回应答,并且他们的其他合作伙伴都没有报告任何延迟(但我不确定我相信他们 - 他们之前撒谎了)。快速HTTP调用ASP.Net

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.example.com"); 
request.Timeout = 38000; 
request.Method = "POST"; 
request.ContentType = "text/xml"; 
StreamWriter streamOut = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII); 
streamOut.Write(XMLToSend);  // XMLToSend is just a string that is maybe 1kb in size 
streamOut.Close(); 
HttpWebResponse resp = null; 
resp = (HttpWebResponse)request.GetResponse();  // This line takes between 2 and 22 seconds to return. 
StreamReader responseReader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8); 
Response = responseReader.ReadToEnd();  // Response is merely a string to hold the response. 

是否有任何理由,上面的代码只会...暂停?代码运行在一个非常坚实的托管服务提供商(Rackspace Intensive Segment)中,并且它所在的机器没有被用于其他任何事情。我只是测试一些我们即将投入生产的代码。所以,并不是机器被征税,并且考虑到它是Rackspace,并且我们正在支付一大笔费用,我怀疑这是他们的网络。

我只是想确保我的代码是尽可能快的,而且我没有做任何愚蠢的事,因为在几个星期内,这个代码将上升到运行20,000个请求,以这个第三部分每小时。

+0

你和目标服务器之间是否有代理?如果服务器的响应时间不是延迟,那么延迟实际上可能是建立连接。 – Jacob 2011-05-05 20:23:31

+0

雅各布,我不这么认为。至少不在我身边。我敢打赌,他们确实在他们身边,而这正是我想向他们证明的。 – 2011-05-05 20:35:38

+1

没有什么能让一个美好的一天变得糟糕,就像不得不证明别人的问题一样。 – 2011-05-05 20:47:20

回答

2

有几件事情,我会做:

  1. 我会配置上面的代码,并得到一些明确的时间。
  2. 执行using语句以正确处置资源。
  3. 以异步风格编写代码,一旦它发生变化,就会有很多IO等待。
+0

回答你的观点:1 - 我已经做到了。我已经验证了,直到千分之一秒(每log4net),最长的那一行实际上是resp =(HttpWebResponse)request.GetResponse();线。 2 - 我会这样做(除了上述Dean North的建议外)。 3 - 我可能会也可能不会这样做 - 这个代码存在于一个类中的方法中,我从一个.ashx处理程序运行,并且我正在异步运行它(任务ccTask = Task.Factory.StartNew(cc .RunWebRequest))。或者你的意思是这样的:http://stackoverflow.com/questions/202481 – 2011-05-05 20:34:41

+0

是按照你的链接,这将释放线程进行其他处理,直到需要处理回调。否则,你只是在一个任务内阻塞。 – RubbleFord 2011-05-05 20:42:16

+0

也有你在你的网络配置/应用程序配置提升最大连接到一个IP。松散地记住2的数字是默认值。 – RubbleFord 2011-05-05 20:43:16

4

尝试在关闭之前进行冲洗。

streamOut.Flush(); 
streamOut.Close(); 

还可以下载Microsoft网络监视器查看特定如果托起是你或他们,你可以在这里下载...

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=983b941d-06cb-4658-b7f6-3088333d062f&displaylang=en

+0

@Dean North - 我下载并运行了它。从救火车上喝酒。我看到的每一个看起来像它的条目都在进程名称w3wp.exe中(这是有道理的,因为我的代码位于.ashx文件中,并且通过调用它来启动)。而且我确实在16秒的这些条目之间发生了一次跳跃,我的日志记录指出这是通话完成的时间。有什么具体的我应该寻找可能吗? – 2011-05-05 20:46:33

+0

您是否可以通过简单的HTML表单将相同的帖子发送到“https://www.xxx.com”,以完全测试代码之外的速度? 如果这也有一个16秒的滞后,那么它直接指向第三方责备的手指。 – 2011-05-05 20:49:30

+0

是的。刚刚过了22秒。我个人确定这是他们。 – 2011-05-05 21:36:58

1

你可以在普通的ole浏览器中点击URL吗?那有多快?

你可以在这段代码中击中其他URL(不是你的合作伙伴的)吗?那有多快?

您完全有可能被'延迟错误'所困扰,即使您的合作伙伴的即时响应导致您的观点发生不可预测的延迟。

另一个想法:我注意到你的URL中的https。使用http更快吗?

+0

我可以用浏览器打它,但响应仍然很慢(表明它不是我的代码)。我还没有尝试去其他网站。我会发现另一台服务器,我可以在Rackspace环境之外进行某种测试。 '延迟错误' - 你的意思是说,互联网有时候会吸引没有明显的理由?我无法用http进行测试 - 它一直都是https,并且他们不想花时间考虑他们认为的“我的问题”。 – 2011-05-05 20:38:09

+0

@Matt:通过'latency bug'我真的认为你和你的URL之间都有什么?我想这意味着互联网只是吮吸,但有很多因素。这很有趣:http://dsoguy.blogspot.com/2007/06/latency-v-throughput.html – n8wrl 2011-05-06 15:30:21

+0

这就是我的意思。感谢您的链接 - 伟大的比喻。至于在我和目标网址之间,我真的不知道那么多。 Tracert对于某一点很有帮助,然后在第12跳之后才会超时。可能是因为他们的硬件设置为忽略它。 – 2011-05-06 16:38:51