6

我正在管理一个网站,该网站在过去几个月通过使用 MVC 3.0 ASP.net 构建的 IIS 7.5 运行良好。当我们的 AJAX POST 请求(通过 jQuery 触发)失败时,我们会时不时地面临一个问题,因为正在发布的 JSON 被截断。

到目前为止,我们发现对于所有此类请求,请求的“Content-Length”标头包含的数据比我们实际在请求中获得的数据多。

我们已经在 web.config 中将maxRequestLength设置为 51200,并且我相信maxAllowedContentLength的值有一个相当大的默认值(我们没有在我们的配置中设置它)。我也有一个失败的请求,“内容长度”低至 7301(字节),但我们设法只得到了 2179 个字节。所以我不怀疑这会达到任何限制。

有问题的请求的请求标头如下

  • 缓存控制:无缓存
  • 连接:保持活动
  • Pragma:无缓存
  • 内容长度:7301
  • 内容类型:应用程序/json;字符集=utf-8;
  • 接受:应用程序/json、文本/javascript、/;q=0.01
  • 接受编码:gzip,放气
  • 接受语言:en-us,en;q=0.5
  • 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1
  • X-Requested-With: XMLHttpRequest

有任何想法吗 ??


更新:我已经能够进一步将问题与我们的代码隔离开来。编写了一个独立的控制器,它接受 JSON 字符串并将其反序列化。如果出现错误,它会记录错误。

当我在 50 个请求的循环中与 150 个并发线程并行访问此控制器时,我会遇到一些失败,其中此控制器接收的 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 论坛上找到有关此错误的信息,但尚未尝试给出(多个)建议。以下链接可以作为搜索更多内容的良好起点

http://forums.iis.net/p/1149787/1917288.aspx

4

1 回答 1

1

我终于找出了解决方案的原因和解决方法。不幸的是,它不适用于我的所有环境,但有助于生产环境。在下面找到详细信息

事实证明这是由于 Windows 2008 R2 中的一个错误造成的,它使 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上的主题

于 2012-10-11T05:20:11.573 回答