【问题标题】:Fast HTTP call ASP.Net快速 HTTP 调用 ASP.Net
【发布时间】:2011-08-19 16:52:12
【问题描述】:

我正在使用以下代码向第 3 方发送 HTTPWebRequest。响应需要 2 到 22 秒才能返回。第 3 方声称,一旦他们收到它,他们会立即回复,并且他们的其他合作伙伴都没有报告任何延迟(但我不确定我是否相信他们——他们以前撒过谎)。

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 个请求。

【问题讨论】:

  • 你和目标服务器之间有代理吗?如果服务器的响应时间不是延迟,可能延迟实际上是建立连接。
  • 雅各布,我不这么认为。至少不在我身边。不过,我敢打赌他们是站在他们这边的,这就是我要向他们证明的。
  • 没有什么比证明别人的问题更能让美好的一天变糟的了。

标签: c# asp.net httpwebrequest httpwebresponse


【解决方案1】:

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

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

还可以下载微软网络监视器,看看是你还是他们,你可以在这里下载...

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

【讨论】:

  • @Dean North -- 我下载并运行了它。用消防水管喝水。我看到的与我相关的每个条目都位于进程名称 w3wp.exe 下(因为我的代码位于 .ashx 文件中并通过调用它启动)。而且我确实看到这些条目之间的时间跳跃为 16 秒,我的日志记录表明这是调用完成的时间。有什么具体的我应该寻找的吗?
  • 您是否可以通过简单的 html 表单向“xxx.com”发布相同的帖子,以完全在您的代码之外测试速度?如果这也有 16 秒的延迟,那么它会将责任直接指向第 3 方。
  • 是的。刚刚22秒。我个人确信是他们。
  • 它肯定已经排除了您的代码是问题的原因。剩下的就是您与他们的服务器的连接,尝试从不同的位置运行您的 html 文件。如果这也很慢,那么我会将显示减速的示例 html 页面和显示延迟的网络监视器日志的屏幕截图发送给他们,然后将其推回给他们。
  • 我最初提出的问题是我的代码是否导致了第 3 方服务器的延迟,而您和 RubbleFord 都为我提供了一些代码建议。他还有几个我实施的,所以我给了他“答案”复选标记。但我当然赞成你的回答,我只想对你的所有帮助表示感谢。
【解决方案2】:

我会做一些事情:

  1. 我会分析上面的代码并获得一些明确的时间安排。
  2. 实施 using 语句以正确处理资源。
  3. 以异步方式编写代码,一旦加速,IO 等待时间将会非常长。

【讨论】:

  • 回答你的观点: 1 -- 我已经做到了。我已经验证,直到千分之一秒(每个 log4net),耗时最长的行实际上是 resp = (HttpWebResponse)request.GetResponse();线。 2 -- 我会这样做(除了上面 Dean North 的建议)。 3 -- 我可能会也可能不会这样做 -- 此代码存在于我从 .ashx 处理程序运行的类的方法中,并且我正在异步运行它(Task ccTask = Task.Factory.StartNew(cc .RunWebRequest);)。或者你的意思是这样的:stackoverflow.com/questions/202481
  • 是的,根据您的链接,这将释放线程以进行其他处理,直到需要处理回调。否则你只是阻塞在一个任务中。
  • 您还提升了网络配置/应用配置中某个 IP 的最大连接数。大致记住数字 2 是默认值。
  • 问你一个简单的问题——我想我已经完成了 99% 的问题(我的意思是异步的)。但是我收到一个错误“无法从传输连接读取数据:现有连接被远程主机强行关闭。”我调用 EndGetResponse 就好了(我认为),我可以从 response.GetResponseStream() 制作一个流式阅读器,但是当我做 .ReadToEnd() 时,它就会爆炸。有任何想法吗?我应该问一个全新的问题吗?
  • 我得到了它的工作 - 感谢您的所有帮助。当然,这个问题对我来说是个愚蠢的问题。但是现在我尽可能使用“使用”语句,我在关闭它之前使用 .Flush() 输出流(并且它包含在 using 语句中),现在我正在使用异步调用来避免阻塞线程。不,当您提到最大连接数时,我会弄清楚您指的是什么。感谢您的所有帮助。
【解决方案3】:

你能在普通的 ole 浏览器中点击 URL 吗?这有多快?

您可以在此代码中点击其他网址(不是您的合作伙伴的)吗?这有多快?

您完全有可能被“延迟错误”所困扰,即使您的合作伙伴的即时响应也会导致您认为无法预测的延迟。

另一个想法:我注意到您网址中的 https。使用 http 会更快吗?

【讨论】:

  • 我可以用浏览器点击它,但是响应仍然很慢(表明它不是我的代码)。我还没有尝试访问其他网址。我会在 Rackspace 环境之外找到另一台可以进行某种测试的服务器。 '延迟错误' - 你的意思是,互联网有时会无缘无故地糟蹋?我无法使用 http 进行测试——它总是使用 https,而且他们不想花时间在他们认为“我的问题”上。
  • @Matt:“延迟错误”我的意思是你和你的 URL 之间的所有内容?我想这意味着互联网很糟糕,但有很多因素。这很有趣:dsoguy.blogspot.com/2007/06/latency-v-throughput.html
  • 这基本上就是我的意思。感谢您的链接-很好的类比。至于我和目标 URL 之间的内容,老实说,我不太了解。 Tracert 在一定程度上很有帮助,然后在 hop 12 之后超时。可能是因为他们的硬件设置为忽略它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 2023-03-07
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多