我甚至不知道从哪里开始,主要是因为我甚至无法确定问题的根源——我只能找到症状。
我只是要描述发生了什么,诊断的细节,以及我已经做了什么来尝试修复它,希望有人可以将我从这个地狱中解救出来,或者至少为我指明出口。
发生时间
- 使用 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 失败时,客户端最终显示 504(网关超时)
- 我们的应用程序中的全局错误捕获不会记录任何错误
- Windows 事件查看器中没有记录 IIS 或 ASP 的错误
只有当从服务器本身上传时,POST 才能对这些文件起作用!
我的意思是导航到http://localhost
并执行上传过程。这始终有效。
已尝试修复
executionTimeout
下httpRuntime
设置web.config
为6分钟。参考maxRequestLength
下的httpRuntime
设置web.config
为50MB。maxAllowedContentLength
设置requestLimits
为web.config
50MB。
我已经束手无策了,有人可以解释一下吗?