我正在尝试追踪 Windows 7 上 IIS 7.5 的一个非常奇怪的错误。首先,这里有一些背景信息。
我有一个非常简单的 ASP.NET Web 应用程序,其代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<customErrors mode="Off"/>
</system.web>
</configuration>
<%@ Page Language="C#" Inherits="_Default" CodeFile="default.aspx.cs" %>
<html>
<body>
<h1><asp:literal runat="server" id="litHeading1" /></h1>
<form runat="server">
<asp:TextBox id="tbInput" runat="server" />
<asp:Button id="btnSubmit" Text="Submit" runat="server" />
</form>
</body>
</html>
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if( IsPostBack ) {
litHeading1.Text = "Posted! Hi, " + tbInput.Text;
} else {
litHeading1.Text = "Get";
}
}
}
我还有一个非常简单的 Python 脚本来访问这个页面并发布内容:
import requests as reqm
url = 'http://localhost/testapp4.0/default.aspx'
post_payload = {
# post values don't seem to matter, having them or not having them
# doesn't seem to affect the problem
'__VIEWSTATE': r"/wEPDwUKMTU1MDMxMzU0MQ9kFgICAQ8WAh4EVGV4dAUDR2V0ZGShYB/fzaT/YSTSt7FPGhIQcCrp1GbI+eD2bLFl1qUxWA==",
'__EVENTVALIDATION': r"/wEWAwLT5c/kDALpouS8DQLCi9reA+DdtetcF6QuZcTZOdNPIJzwWkvX+ITpSzlbXCsWVizl",
'tbInput': 'fred',
'btnSubmit': 'Submit',
}
def doit():
req = reqm.post(url, data=post_payload)
print(req.text)
# if it doesn't show up in one run, bump value to
# 500 or so
for x in range(1):
doit()
所以有什么问题?
问题是 IIS 频繁断开连接,但仅在执行 POST 操作时才会发生。如果将脚本更改为使用 GET 操作,则不会出现任何问题。
IIS 日志文件示例:
2012-11-28 00:48:57 ::1 POST /testapp4.0/default.aspx - 80 - ::1 python-requests/0.14.0+CPython/2.7.2+Windows/7 400 0 64 6767
IIS 跟踪文件示例:
https://gist.github.com/4158347
来自 Python 请求的 IIS HTTP.err 示例:
2012-11-28 00:44:16 ::1%0 53528 ::1%0 80 HTTP/1.1 POST /testapp4.0/default.aspx - 1 Timer_EntityBody Classic+.NET+AppPool
2012-11-28 01:16:03 ::1%0 53928 ::1%0 80 HTTP/1.1 POST /testapp4.0/default.aspx - 1 Timer_EntityBody .NET+4.0
同上,但是来自失败的 PHP 请求:
2012-11-28 01:19:33 ::1%0 53942 ::1%0 80 - POST /testapp4.0/default.aspx - - Timer_HeaderWait -
我对各种事情进行了反复尝试,试图找出
无论我如何尝试,问题总是出现:
- ASP.NET 2.0 与 4.0
- 多台 Windows 7 Pro 机器,一台虚拟机,一台笔记本电脑
- 本地主机流量与通过网络流量
- 经典模式和集成模式
- Python 2.7、3.3、PHP 5.4 客户端脚本(在 Windows 和 Linux 上运行)
- IIS 快讯
- 在脚本循环中设置 1 秒的请求延迟
- 改变了我发布的参数。从完全准确的视图状态等到“foo=bar”
- 关闭 Windows 防火墙
间歇性
- 长期以来,Python 脚本总是会在第一次请求时出错。然后,偶尔,它们会开始工作,并且大部分时间都能正常工作。如果我将脚本放入紧密循环中,服务器很快就会再次挂起。
- 最初,PHP 脚本始终在第一个请求时运行,但在紧密循环中也会持续失败。
解决:
- 使用 Windows 2003 服务器(IIS 6),连续 500 个请求没有问题
- 当我知道脚本已挂起但尚未出错时,我终止了脚本,接下来的几个请求通常会有效。
- 如果我让它超时而不是终止它,并尝试再次运行该脚本,它通常会在下一个请求时再次挂起。
速率限制?
我想知道这是否是 Windows 7 上 IIS 7.5 中的某种速率限制问题。我了解到它有一定的限制,因为它不在服务器操作系统上运行。然而,这并不能解释为什么我在运行非常不频繁的请求时仍然会看到这个问题。
为什么这是一个问题?
我正在尝试针对 WebForms .NET 应用运行功能测试。您可以想象,频繁断开连接会严重影响我的测试!
我花了好几天的时间来解决这个问题,非常感谢大家的帮助!
答案1
哇!我又在谷歌上搜索了一下,发现一个人提到了 AVG。灯灭了,我完全禁用了 AVG,问题就消失了。进一步的测试表明问题出在 LinkScanner 功能上。
我早就考虑过 AVG,但由于我没有互联网安全版本,我认为它不会产生影响。我非常后悔这个假设!