2012-12-03 35 views
2

要將文件發送到服務器,我在Windows HTTPS PUT請求,它看起來像這樣:如何在會話中爲許多put請求重用相同的HTTPS連接?

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連接?
+2

所有你需要做的是停止關閉會話和連接。 WinHTTP(假定版本爲5.1)在內部處理所有這些事情,管理持久性TCP連接池,並讓請求僅在實際發送請求和接收響應時「借用」連接。 –

+0

@David Schwartz,我給你正確的嗎?我可以是這樣的: hSession = WinHttpOpen(L 「代理/ 1.0」,.. hConnect = WinHttpConnect(hSession,.. 的(...) { hRequest = WinHttpOpenRequest(hConnect,L 「PUT」 ,.. WinHttpSetCredentials(hRequest,.. WinHttpAddRequestHeaders(hRequest,.. WinHttpSendRequest(hRequest,.. WinHttpWriteData(hRequest,.. WinHttpReceiveResponse(hRequest,.. WinHttpQueryHeaders(hRequest,..} 如果 ( hRequest)WinHttpCloseHandle(hRequest); if(hConnect)WinHttpCloseHandle(hConnect); if(hSession)WinHttpCloseHand勒(hSession); –

+1

是的。您可以在同一會話中針對同一連接繼續發出儘可能多的請求。 –

回答

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); 
    
+0

在不同的線程中使用相同的會話句柄是否安全? –