HTTP请求的内容长度 > body大小
HTTP请求的内容长度 > body大小
我管理着一个通过IIS 7.5构建的MVC 3.0 ASP.net网站,最近几个月一直运行良好。然而,我们偶尔会遇到一个问题,就是我们的通过jQuery发起的AJAX POST请求失败,因为被发送的JSON被截断了。
到目前为止,我们发现所有这样的请求都比实际接收到的请求中的“Content-Length”头部字段包含更多的数据。
我们已经在web.config中将maxRequestLength设置为51200,并且我相信maxAllowedContentLength的默认值相当大(我们没有在配置中设置它)。另外,我有一个“Content-Length”只有7301字节的请求失败了,但我们只收到了2179字节。因此,我不认为这是因为达到了任何限制。
问题请求的请求头如下:
- Cache-Control: no-cache
- Connection: keep-alive
- Pragma: no-cache
- Content-Length: 7301
- Content-Type: application/json; charset=utf-8;
- Accept: application/json, text/javascript, /; q=0.01
- Accept-Encoding: gzip, deflate
- Accept-Language: en-us,en;q=0.5
- User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1
- X-Requested-With: XMLHttpRequest
有什么想法吗?
更新:我已经能够从我们的代码中进一步分离出问题。我编写了一个独立的控制器,接受一个JSON字符串并进行反序列化。如果发生错误,它会记录错误信息。
当我以循环的方式使用150个并发线程并发访问这个控制器的50个请求时,我会遇到一些失败情况,这个控制器接收到的JSON被截断了。现在我们正在专注于优化IIS,并阅读更多与之相关的各种参数的信息(目前我们在IIS上使用的是默认参数)。
我强烈觉得150个并发连接不应该是个大问题,并真诚地希望通过调整一些参数来解决这个问题。一旦解决了这个问题,我会分享我的发现。
*更新2(10月8日)*:我进一步缩小了问题的范围。我在IIS中开启了错误日志,并发现我的失败请求在读取数据时出现以下错误:
BytesReceived = 0 ErrorCode = 2147943395 Error Description = "The I/O operation has been aborted because of either a thread exit or an application request.(0x800703e3)"
我正在IIS论坛上寻找有关这个错误的信息,但我还没有尝试(多个)给出的建议。以下链接可以作为搜索更多信息的起点:
这个问题的出现是由于Windows 2008 R2中的一个bug导致的,即使没有断开连接,它也会让asp.net认为客户端已经断开连接。可以通过一个热修复来解决这个问题,该修复可以在http://support.microsoft.com/kb/977453找到。这个修复已经包含在Windows 2008 R2 SP1中(可以在这里找到)。
这个热修复对于我在运行Windows 2008 R2的一个环境中有效,但不能应用于安装了SP1的Windows 2008 R2。不幸的是,在安装了SP1的环境中仍然可以重现这个问题,并且没有解决。我在IIS论坛上为这个问题开了一个新的案例,可以在http://forums.iis.net/t/1192310.aspx上跟踪它。
要了解更多关于这个问题的信息,可以在http://forums.iis.net/p/1149787/1917288.aspx上关注这个帖子。
我们遇到了同样类型的错误,但是在Windows 2008上(不是R2)。此外,我有点困惑,你说“修复已经包含在Windows 2008 R2 SP1中”,然后你又说“不幸的是,在安装了SP1的环境中仍然可以重现这个问题。”你解决了这个问题吗?我遇到了一个非常类似的问题...在安装了Windows 2008 R2 SP1后,问题仍然存在...在Windows 2008 R2上,我应用了热修复,一切正常。