【发布时间】:2012-11-21 08:38:05
【问题描述】:
要将文件发送到服务器,我在 Windows 中执行 HTTPS put 请求,如下所示:
hSession = WinHttpOpen( L"Agent/1.0",..
hConnect = WinHttpConnect(hSession,..
hRequest = WinHttpOpenRequest( hConnect, L"PUT",..
WinHttpSetCredentials(hRequest,..
WinHttpAddRequestHeaders( hRequest,..
WinHttpSendRequest( hRequest,..
WinHttpWriteData(hRequest,..
WinHttpReceiveResponse(hRequest,..
WinHttpQueryHeaders(hRequest,..
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);
这个命令包针对每个应该发送到服务器的文件运行。为要发送的每个文件从头开始建立连接会产生额外的开销。现在我正在寻找一种方法来减少这种开销。
所以我有两个问题:
- 是否需要为每个 put 请求打开和关闭新的 HTTPS 连接?
- 有没有办法建立一个会话并为该会话中的许多 put 请求重用相同的 HTTPS 连接?
【问题讨论】:
-
您所要做的就是停止关闭会话和连接。 WinHTTP(假设是 5.1 版)在内部处理所有这些,管理持久 TCP 连接池并让请求仅在实际发送请求和接收响应时“借用”连接。
-
@David Schwartz,我听错了吗?我可以这样: hSession = WinHttpOpen( L"Agent/1.0",.. hConnect = WinHttpConnect(hSession,.. for (...) { hRequest = WinHttpOpenRequest( hConnect, L"PUT",.. WinHttpSetCredentials(hRequest ,.. WinHttpAddRequestHeaders( hRequest,.. WinHttpSendRequest( hRequest,.. WinHttpWriteData(hRequest,.. WinHttpReceiveResponse(hRequest,.. WinHttpQueryHeaders(hRequest,.. } if (hRequest) WinHttpCloseHandle(hRequest); if (hConnect) WinHttpCloseHandle(hConnect ); if (hSession) WinHttpCloseHandle(hSession);
-
是的。您可以在同一会话中针对同一连接继续发出任意数量的请求。
-
@DavidSchwartz 你为什么不把你的评论作为答案?