向IIS7站点发布大于6MB的文件会导致I / O操作中止,并丢弃networking连接

我甚至不知道从哪里开始,主要是因为我甚至无法确定问题的根源 – 我只能find症状。

我只是要描述它发生了什么,诊断的细节,以及我已经做了什么来试图解决它,希望有人能把我从这个地狱中救出来,或者至less指向我的出口。

发生时

  • 使用Web表单发布大于〜6MB的任何types的文件。 (如<form>
  • 独立于正在运行的网站的types发生 – 在同一台服务器上托pipe的PHP和ASP.NET网站中,问题仍然存在。
  • 在对相同站点的负载平衡版本进行尝试时不会发生 – 使用ELB的两台服务器
  • 当文件大小为〜6MB时不能一致地重现 – 当失败的请求跟踪被禁用时,相同的testing成功,然后在启用时失败。

症状

使用IIS的失败请求追踪我已经能够find一些线索。

当文件POSTs成功的结果是立竿见影的。 跟踪logging服务器对客户端发送的请求的所有读取。 在文件的末尾,我得到这个条目

 GENERAL_READ_ENTITY_START Duration 0ms GENERAL_REQUEST_ENTITY_END BytesReceived 7870 ErrorCode 0 ErrorCode The operation completed successfully. (0x0) Duration 468ms 

在这个入口之后,进程的其余部分运行,跟踪中的最后一个入口是flush和响应的结束。

 GENERAL_FLUSH_RESPONSE_END BytesSent 12245 ErrorCode 0 ErrorCode The operation completed successfully. (0x0) GENERAL_REQUEST_END BytesSent 12245 BytesReceived 2598298 HttpStatus 200 HttpSubStatus 0 

当文件POST失败时,读取会有很长的延迟,然后是I / O中止和连接中断

请求中的最后一个条目如下所示:

 GENERAL_READ_ENTITY_START Duration 133443 ms GENERAL_REQUEST_ENTITY_END BytesReceived 0 ErrorCode 2147943395 ErrorCode The I/O operation has been aborted because of either a thread exit or an application request. (0x800703e3) Duration 138248ms 

注意巨大的持续时间。 通常END条目是3000-4000ms, START是0或接近于0。

在追踪结束

 GENERAL_FLUSH_RESPONSE_END BytesSent 0 ErrorCode 2147943629 ErrorCode An operation was attempted on a nonexistent network connection. (0x800704cd) GENERAL_REQUEST_END BytesSent 0 BytesReceived 7210715 HttpStatus 200 HttpSubStatus 0 

其他症状

  • 当POST失败时,客户端最终会显示504(网关超时)
  • 全局错误在我们的应用程序中捕获不会logging任何错误
  • Windows事件查看器中logging的IIS或ASP没有错误

POSTing对这些文件进行操作的唯一时间是从服务器本身进行上传的时间!

通过这个我的意思是导航到http://localhost并执行上传过程。 这是100%的时间。

修复已经尝试

  • web.config httpRuntime下的executionTimeout设置为6分钟。 参考
  • web.config httpRuntime下的maxRequestLength设置为50MB。
  • web.config中的requestLimits中的maxAllowedContentLength设置为50MB。

我在智慧的结尾,谁能对此有所了解?