将大于 6MB 的文件发布到 IIS7 网站会导致 I/O 操作中止和网络连接断开

将大于 6MB 的文件发布到 IIS7 网站会导致 I/O 操作中止和网络连接断开

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

我只是要描述发生了什么,诊断的细节,以及我已经做了什么来尝试修复它,希望有人可以将我从这个地狱中解救出来,或者至少为我指明出口。

发生时间

  • 使用 Web 表单发布大于 ~6MB 的任何类型的文件。(喜欢<form>
  • 与所运行的网站类型无关——问题仍然存在于同一台服务器上托管的 PHP 和 ASP.NET 网站上。
  • 针对同一站点的负载平衡版本进行尝试时不会发生这种情况-- 两台使用 ELB 的服务器
  • 当文件大小约为 6MB 时,无法一致地重现——当禁用失败请求跟踪时,相同的测试成功,而当启用失败请求跟踪时,相同的测试失败。

症状

使用 IIS 的失败请求跟踪我已经能够找到一些线索。

当文件 POST 成功时,会立即产生结果。该跟踪记录了服务器对客户端发送的请求的所有读取。在文件末尾,我得到了以下条目

GENERAL_READ_ENTITY_START
Duration
0ms

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

此项之后,其余进程运行,跟踪中的最后一个条目是刷新和响应的结束。

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 才能对这些文件起作用!

我的意思是导航到http://localhost并执行上传过程。这始终有效。

已尝试修复

  • executionTimeouthttpRuntime设置web.config为6分钟。参考
  • maxRequestLength下的httpRuntime设置web.config为50MB。
  • maxAllowedContentLength设置requestLimitsweb.config50MB。

我已经束手无策了,有人可以解释一下吗?

相关内容