System.Web.HttpRequest.FillInFormCollection()和System.Web.HttpRequest.GetEntireRawContent()非常慢

时间:2011-11-22 05:20:49

标签: c# asp.net .net performance system.web

我一直关注我网站的性能以及所有执行缓慢的代码(> 1s),超过90%是因为System.Web.HttpRequest.GetEntireRawContent()(由System.Web.HttpRequest调用) .FillInFormCollection())

对于ASP.NET站点来说这是正常的......有时在FillInFormCollection方法中花费超过10秒(显然它是从System.Web.UI.Page.PerformPreInit()中调用的)?

或者有办法解决这个问题?

我正在为.NET Framework 3.5编译。

页面我遇到的问题主要是登录页面,虽然没有什么不寻常之处 - 两个TextBox,Checkbox for RememberLogin和Login按钮。 Request.ContentLength大约是5KB(我已经记录了Request.Form.ToString() - 没有发现任何异常)。我已经进行了大量的跟踪(期待巨大的POST)和调试但是找不到任何合理的理由让FillInFormCollection花费超过10秒(我曾经有过250秒的极端例子)。我甚至试过放慢与Fiddler的联系,但无法重现这个问题。

编辑:感谢所有评论家伙。我一直在继续追求这个问题...如果它至少得到解决它会拯救其他人很长一段时间;)。以下是一些问题的答案。

  1. 这是普通的HTTP(不是HTTPS),Log中有0个错误(有趣的是请求实际上已完成;)
  2. 用户点击Login.aspx时未加载网站。网站在99%的时间内工作得非常好(每周处理大约4000万个HTTP请求,AVG CPU利用率低于10%)
  3. 肯定是application / x-www-form-urlencoded - ASP.NET Forms(runat = server)以这种方式提交。我唯一不明白的是为什么.NET需要> 10秒才能读取低于6KB的POST。
  4. 我提出的唯一合理的结论(到目前为止)是 - >客户从真正缓慢的连接(remember GPRS?)访问网站。但我真的想探索所有其他选项,而不是仅仅依靠“它的用户连接”。如果是这种情况 - 我希望我会在每个页面上看到类似的事情发生在用户身上。
  5. 只是希望它不是这样的:IIS 6.0 Server Too Busy HTTP 503 Connection_Dropped DefaultAppPool
  6. 已提及此页面:Identifying Slow HTTP Attack Vulnerabilities on Web Applications可能会发生这种情况。

1 个答案:

答案 0 :(得分:16)

以下是我发现我的应用程序在该方法上表现不佳的问题,或者我应该说是原因:System.Web.HttpRequest.FillInFormCollection()

似乎System.Web.HttpRequest.FillInFormCollection()一旦获得提交给表单的数据的开头就开始,并在收到最后一位数据后完成。如果我的用户连接不良,则可能需要很长时间才能完全提交此信息。因此,这种方法的时间很长。

我在本地计算机上使用了带宽限制器,并且能够重现符合我测试的不同速度的一致结果,连接速度越慢,System.Web.HttpRequest.FillInFormCollection()运行的时间越长。

除非您收到有关您的网站无法正常工作的投诉,否则您可能只是在查看具有糟糕连接的用户运行的代码。