【问题标题】:How to reuse the same HTTPS connection for many put requests within a session?如何为会话中的多个 put 请求重用相同的 HTTPS 连接?
【发布时间】: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 你为什么不把你的评论作为答案?

标签: c++ web https put winhttp


【解决方案1】:

答案如下:

  1. 没有。一个连接可能会执行一堆请求。
  2. 这是代码草稿:

    hSession = WinHttpOpen( L"Agent/1.0",..
    hConnect = WinHttpConnect(hSession,.. 
    for (all_files_to_upload) { 
        hRequest = WinHttpOpenRequest( hConnect, L"PUT",..
        WinHttpSetCredentials(hRequest,.. 
        WinHttpAddRequestHeaders( hRequest,.. 
        WinHttpSendRequest( hRequest,.. 
        WinHttpWriteData(hRequest,.. 
        WinHttpReceiveResponse(hRequest,.. 
        WinHttpQueryHeaders(hRequest,.. 
        WinHttpCloseHandle(hRequest);
    } 
    
    if (hConnect) WinHttpCloseHandle(hConnect);
    if (hSession) WinHttpCloseHandle(hSession);
    

【讨论】:

  • 在不同线程中使用同一个会话句柄是否安全?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2015-12-18
  • 2020-06-19
  • 2012-12-17
  • 2020-05-05
  • 2022-01-06
  • 2012-07-07
相关资源
最近更新 更多