我一直在关注我的网站的性能,并且在所有执行缓慢的代码(>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 的连接速度,但无法重现该问题。
编辑:感谢所有的评论家伙。我一直在研究这个问题......如果它至少得到解决,它会为其他人节省相当多的时间;)。以下是一些问题的答案。
- 它是普通的 HTTP(不是 HTTPS),日志中有 0 个错误(有趣的是请求实际上已经完成;)
- 用户点击 Login.aspx 时未加载站点。站点实际上在 99% 的时间内运行良好(每周处理大约 4000 万个 HTTP 请求,平均 CPU 利用率低于 10%)
- 这绝对是 application/x-www-form-urlencoded - ASP.NET Forms (runat=server) 以这种方式提交。我唯一不明白的是为什么.NET 需要>10 秒才能读取小于 6KB 的 POST。
- (到目前为止)我得出的唯一合理结论是 -> 客户从非常慢的连接访问站点(还记得 GPRS吗?)。但我真的很想探索所有其他选项,而不仅仅是诉诸“它的用户连接”。如果是这样的话 - 我希望我会在每个页面上看到用户发生类似的事情。
- 只是希望它不是这样的:IIS 6.0 Server Too Busy HTTP 503 Connection_Dropped DefaultAppPool
- 请参阅此页面:识别 Web 应用程序上的慢速 HTTP 攻击漏洞这可能正在发生。