16

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

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

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

我正在为 .NET Framework 3.5 进行编译。

我主要遇到麻烦的页面是登录页面,尽管它没有什么不寻常的 - 两个文本框,RememberLogin 的复选框和登录按钮。Request.ContentLength 大约 5KB(我已经记录了 Request.Form.ToString() - 没有发现任何异常)。我已经执行了很多跟踪(期待巨大的 POST)和调试,但找不到任何合理的理由让 FillInFormCollection 花费超过 10 秒(我曾经有过 250 秒的极端示例)。我什至尝试减慢与 Fiddler 的连接速度,但无法重现该问题。

编辑:感谢所有的评论家伙。我一直在研究这个问题......如果它至少得到解决,它会为其他人节省相当多的时间;)。以下是一些问题的答案。

  1. 它是普通的 HTTP(不是 HTTPS),日志中有 0 个错误(有趣的是请求实际上已经完成;)
  2. 用户点击 Login.aspx 时未加载站点。站点实际上在 99% 的时间内运行良好(每周处理大约 4000 万个 HTTP 请求,平均 CPU 利用率低于 10%)
  3. 这绝对是 application/x-www-form-urlencoded - ASP.NET Forms (runat=server) 以这种方式提交。我唯一不明白的是为什么.NET 需要>10 秒才能读取小于 6KB 的 POST。
  4. (到目前为止)我得出的唯一合理结论是 -> 客户从非常慢的连接访问站点(还记得 GPRS吗?)。但我真的很想探索所有其他选项,而不仅仅是诉诸“它的用户连接”。如果是这样的话 - 我希望我会在每个页面上看到用户发生类似的事情。
  5. 只是希望它不是这样的:IIS 6.0 Server Too Busy HTTP 503 Connection_Dropped DefaultAppPool
  6. 请参阅此页面:识别 Web 应用程序上的慢速 HTTP 攻击漏洞这可能正在发生。
4

1 回答 1

15

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

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

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

除非您抱怨您的网站无法正常工作,否则您可能只是在查看由连接不佳的用户运行的代码。

于 2012-02-14T19:20:31.640 回答