【发布时间】:2015-02-17 07:22:04
【问题描述】:
我正在使用 WinHttpSendRequest/WinHttpWriteData 将一个大 (54Mb) 文件上传到我们的服务器,并以 4Kb 的形式发送给用户反馈。据我所知,直到最近,这一直运作良好。现在,当我尝试时,上传速度非常快,然后 WinHttpReceiveResponse() 调用超时,服务器接收到不完整的数据。
我使用的是 Win 8.1 64bit,IE11 11.0.15(我认为 WinHttp 是用 IE 更新的)但是在我同事的 PC 上 - 相同版本的 Windows,IE,上传速度要慢得多并且响应不会超时。当我尝试在各种虚拟机上进行测试时,问题并不明显。但是其他同事……哦,Windows!
说清楚
据我所知,这段代码曾经可以工作!
调用 WinHttpOpen 没有设置 ASYNC 标志。
HTTP 动词是 POST
Delphi XE2中的代码
Result:= WinHttpSendRequest(RequestHandle,PWideChar(Headers),Length(Headers),WINHTTP_NO_REQUEST_DATA,0,FormBuffer.Size,Cardinal(Self));
If Result
then begin
BytesToWrite:= FormBuffer.Size;
while BytesToWrite > 0
do begin
If BytesToWrite > SizeOf(WriteBuffer)
then BufFill:= SizeOf(WriteBuffer)
else BufFill:= BytesToWrite;
FormBuffer.ReadBytes(WriteBuffer,BufFill); // FormBuffer is my object to supply data and headers
If WinHttpWriteData(RequestHandle,@WriteBuffer[0],BufFill,Written)
then Dec(BytesToWrite,Written)
else Error('WinHttpWriteData'); // Error() method calls GetLastError, assembles error message and logs it
If Assigned(OnDataWrite)
then OnDataWrite(Self,Written); // Event that notifies user
end;
FetchResponse(RequestHandle); // Calls WinHttpReceiveResponse() and then fetches data
Result:= True;
end
else GLE:= Error('WinHttpSendRequest');
这段代码很大程度上是对这段代码的改编:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384120(v=vs.85).aspx
“执行 PUT 的 WinHttp 示例代码”。在底部。
【问题讨论】: